PDA

Ver la Versión Completa : Utilizar DLL C# en c++ builder.


JM1985
29-09-2014, 19:12:11
Hola buen día.


Estoy tratando de utilizar una Dll C# en un proyecto que está en c++ builder 6.

Eh estado investigando pero aun no no me ha quedado claro como utilizar una dll com hecha en C# dentro de c++ builder.

Cual es el mejor camino para cargar dll's hechas en C# dentro de c++ builder?

Gracias.

Saludos.

edgargh
29-09-2014, 23:13:29
hola, creo que ya antes hicieron esa pregunta y la respondieron (usar dll hecha en c# en c++) si la buscas la encontraras tal cual. saludos

JM1985
30-09-2014, 00:59:10
Hola Egdar gracias por responder.

La verdad eh estado leyendo de echo eh visto ese post pero en realidad no dice nada concreto o alguna guía de ejemplo eh echo como dice
con interfaces y todo pero nada no carga la biblioteca y sus métodos.

Tu has utilizado dll .net en c++ Builder 6 ?

Gracias.

Saludos.

edgargh
30-09-2014, 19:30:45
Que tal, no lo he hecho desde c++ builder, pero me toco hacerlo desde delphi. No se hasta que punto lo lleves avanzado, pero de entrada el ensamblado (dll) tal cual lo genera c# no es compatible para importarse en delphi (Builder en tu caso). Debes generarlo como ensamblado compatible o visible a través de COM.

Proyecto->Propiedades de (nombre del proyecto)

Aplicación->Información de ensamblado->Crear ensamblado visible a través de COM

Generar->Registrar para interoperatibilidad COM

En el archivo AssemblyInfo.cs de tu proyecto, asegura tener lo siguiente:

using System.Runtime.InteropServices;

[assembly: ComVisible(true)]

Compila tu proyecto y te generara la dll habilitada para la compatibilidad COM. Lo que sigue es el registro o importación de la dll desde tu lenguaje. No se si desde Builder ya puedas cargar directamente la dll con los cambios realizados a la dll en c#, desde delphi tuve que hacer otros pasos adicionales, seria cuestión que probaras.

No puedo insertar enlaces, pero busca "Crear una DLL (COM) en Visual Studio C# para que sea visible desde Power Builder (PB)", ahi explica mas o menos lo que te comento, espero te sirva. saludos

JM1985
30-09-2014, 21:03:10
Hola Edgar de nuevo gracias por tu respuesta.

Ya realice los pasos que me comentas de echo en otro lenguaje de programación ya pude utilizar los métodos de C#.

Específicamente estoy buscando la manera ahora de acceder desde c++ builder 6 importo en proyecto la librería según eh leído sería por medio de interfaces pero nada mas no no eh logrado que se carga exitosamente para poder utilizar los métodos.


Gracias.

Saludos.

edgargh
30-09-2014, 22:37:57
Hola, busca ".Net interop - using C# assembly from Delphi Win32", viene una herramienta (InteropUtils.exe) y la manera de utilizarla (el único detalle es que esta en ingles). Esta enfocada a delphi, pero si te fijas trae una opción para generar el código también en c++.

básicamente, partes de tu dll (no recuerdo si también necesita estar junto con la dll el archivo tlb, checalo), y a partir de eso puedes generar el código que necesitas para acceder a los métodos. Saludos

aguml
30-09-2014, 22:53:29
¿Y no puedes usar LoadLibrary y GetProcAddress para usar las funciones de la dll dinamicamente?

JM1985
01-10-2014, 15:19:40
Hola Edgar gracias de nuevo por tu respuesta.
Ok voy a revisar y te comento.

Saludos.

JM1985
01-10-2014, 15:21:34
Hola agumi buen día.
Gracias por tu respuesta.

Eh intentado utilizar estos métodos para cargar las dll dinamicamente pero el detalle no eh logrado igual cargar la función con GetProcAddress solo eh logrado cargar la dll con el LoadLibrary.
LoadLibrary y GetProcAddress

Eh visto ejemplos y nada no me logra aun cargar no se si por que están echas en .net las dll.

Saludos.

aguml
01-10-2014, 16:27:45
Mira una cosa, descargate el Dependency Walker y mira realmente el nombre de las funciones. Quizas el problema no es que sea .net, quizas es que por ejemplo, si su nombre es GetDir, al compilar la dll puede ser que se llame por ejemplo _GetDir con lo que si llamas a GetProcAddress con GetDir no lo encontrará. Dependency Walker te dirá los nombres reales de las funciones de la dll. Descargalo de aquí (http://www.dependencywalker.com/)

Y aqui como cargar funciones dinamicamente: http://msdn.microsoft.com/en-us/library/ms810279.aspx

JM1985
01-10-2014, 17:02:05
Hola Agumi.

El detalle está en que en dependency walker .. no me muestra las funciones que se supone que tiene la dll.

JM1985
01-10-2014, 17:14:24
Nada Edga, nada Agumi .. creo que tendré que buscar otras alternativas.. ya que ya llevo un par de días con esto investigando.. probaré con web services. a ver que tal va.

edgargh
01-10-2014, 18:45:26
Hola, solo por curiosidad, con la herramienta que te mencione, ¿no te generó los archivos cpp´s y h's necesarios para referenciar los métodos de la dll?, ¿no los pudiste usar?, ¿que error te marco?, ¿en donde te atoraste o que salió mal que no pudiste llegar a lo que buscas?. Como que eso de Nada, no me dice cual fue la razón por la que no lo pudiste hacer.

aguml
01-10-2014, 19:01:11
Lo unico que se me ocurre es que tenga algun tipo de proteccion como ofuscacion o encriptacion. ¿las funciones que quieres usar de dicha dll son externas? porque si no lo son no podras usarlas. Podrias pasar la dll y que el que quiera ayudarte le pueda echar un vistazo.

JM1985
01-10-2014, 19:03:38
Hola Edgar
me dice que no encuentra el c++ builder Path.

y no genera nada. y ya le puse la ruta que me dice.

JM1985
01-10-2014, 19:04:46
Hola Agumi.
De echo yo estoy haciendo una dll de prueba igual .. que solo me retorne un mensaje. En otro lenguaje ya pude hacer que funcione pero especificamente en c++ builder 6 nada mas no.

Donde puedo subir la ddl de prueba. ?

edgargh
02-10-2014, 00:39:39
Tome la dll en c# (Csharpassembly.dll) que viene de ejemplo en la carpeta "Net interop - C#/Assembly", dentro de los archivos que te dije que bajaras, copie la dll y la puse en una carpeta nueva
Ejecute InteropUtils.exe, seleccione la dll recien copiada
Seleccione la opción Generate c++ files
Presione el boton Export y me genero los cpp´s y h´s necesarios
finalmente presione el boton Register for COM.

Instale el c++ builder 6
Cree un proyecto nuevo y agregue el archivo Csharpassembly_tlb.cpp que me genero InteropUtils
Tome de base el proyecto delphi de prueba que viene en la carpeta "Net interop - C#\Test"
Tome una parte funcional del código y como pude lo converti a c++ builder
y que crees?, funciono.

void __fastcall TForm1::btnTestObjectClick(TObject *Sender)

{
CoNetClass *NetObject;
NetObject = new CoNetClass;
TCOM_NetClass Tcom;

mmoOutput->Lines->Clear();

Tcom = NetObject->Create();
mmoOutput->Lines->Add(Tcom->StringMethod());
}

donde StringMethod() esta dentro de las funciones de la dll de ejemplo.

ecfisa
02-10-2014, 00:52:49
Hola edgargh.

Las etiquetas que podes usar en tus mensajes cuando agregues código C++ son: tu_codigo ó tu_codigo .

También mediante los íconos:
http://sia1.subirimagenes.net/img/2014/10/02/141002124400850585.jpg

habiendo seleccionado previamente el código. (Ya las agregué a tu mensaje)

Saludos :)

edgargh
02-10-2014, 00:55:22
ok, gracias por el dato.

JM1985
02-10-2014, 05:46:59
Hola que tal buenas noches.

Ok .. algo debo estar haciendo mal.

Voy a probar mañana a primera hora y comento como me fue no puede ser que solo ami no me funcione.

Verificaré de nuevo muchas gracias por su ayuda tiene que quedar :) .

Gracias.

Saludos.

JM1985
02-10-2014, 16:20:48
Hola buen día mira aquí te agrego una imagen del error.

De la carpeta Interop C# tome el dll CSharpAssembly y lo copie a otra carpeta escritorio y de ahí seleccione el archivo y seleccione output la misma carpeta y seleccione Generate C++ Files y me arroja este error.

Espero que se entienda la imagen ya que no es muy clara le baje la resolución y el peso para poder subirlo.

Gracias.

Saludos.

ecfisa
02-10-2014, 16:33:39
JM1985, aguml.

Por favor repasen la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

Podrán notar que en el punto 9 dice:

No solicites que te respondan por correo en privado

Los problemas deben ser un proceso público y transparente, durante el cual un primer intento de respuesta puede y debería corregirse si alguien con más conocimientos percibe que la respuesta es incompleta o incorrecta. Además quién te responde obtiene parte de su recompensa al verse que son competentes y útiles a nuestra comunidad.

Cuando pides una respuesta privada, estás interrumpiendo tanto el proceso como la recompensa. No lo hagas.


Saludos y gracias por su colaboracion :)

JM1985
02-10-2014, 16:35:58
Ok enterado.
Disculpa eficsa.
Seguimos en el proceso.


Gracias.

edgargh
02-10-2014, 17:00:00
Hola, no alcanzo a ver lo que dice la imagen pero igual no es necesario, el problema es en tu maquina, permisos de usuario o que se yo, pero no es la dll ni la herramienta, he vuelto a generar los archivos en escritorio, fuera de el y no hay ningún problema, siempre me genera los archivos.

Saludos.

JM1985
02-10-2014, 17:40:38
Hola de nuevo.

Te comento que ya pude hacerlo funcionar.
El error siempre me lo marco pero si me genero el archivo tlb y ese fui que importe y ya pude invocar el método ahora va la parte con mi dll ...

Lo que hice fue registrarlo en una maquina con win 32 por que donde lo probaba era de 64 bits y 7
Gracias por la ayuda Edgar
:D ... :D
Te comento ahora que probaré con mi Dll ya veo que si debería poderse.

Publicaré mis resultados.

Gracias.
Saludos.

aguml
03-10-2014, 00:11:59
ecfisa siento lo que pasó pero como no sabía si la dll era comercial o tenia algun tipo de licencia pues no queria pedir que pusiera el enlace aquí para evitar problemas. Por su puesto lo que iba a hacer era analizarla con un debugger y analizadores para ver si tenia alguna cosa extra que estuviese dando problemas y compartiria la info por aqui. Solo intenté no buscar problemas :o