Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Utilizar DLL C# en c++ builder. (https://www.clubdelphi.com/foros/showthread.php?t=86760)

JM1985 29-09-2014 19:12:11

Utilizar DLL C# en c++ builder.
 
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í

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.
Código PHP:

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: [php] tu_codigo [/php] ó [code] tu_codigo [/code].

También mediante los íconos:


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.


La franja horaria es GMT +2. Ahora son las 21:05:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi