2011-01-09 24 views
13

Tengo una tarea simple:¿Cómo usar un ensamblado .Net en Delphi sin registrarlo en GAC o COM?

es posible escribir un archivo DLL de Delphi y poner un .NET Assembly (con solo una interfaz con 4 métodos y una clase implementando la interfaz) además de llamarlo desde la DLL de Delphi ?

Es decir, ¿puedo importar los tipos de .Net directamente desde el ensamblado .Net (nombre de archivo relativo) si creo un tlb y una unidad delphi para el tlb, sin registrar el ensamblado/tlb?

mejor, thalm

EDITAR (lo que encontré):

mayoría de las soluciones deben registrarse al menos una DLL/TLB para COM. Pero lo más prometedor que encontré fue: Unmanaged Exports de Robert Giesecke, es una plantilla de proyecto de Visual Studio que le permite escribir C# estática (o cualquier lenguaje .NET) métodos y llamarlos desde cualquier lenguaje no administrado, impresionante:

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.StdCall)] 
    public static int Add(int left, int right) 
    { 
     return left + right; 
    } 
} 

EDIT 2: ¡Realmente funciona! ¡Incluso puedes controlar el tipo de clasificación, increíble!

+1

Buen hallazgo de hack +1. Casi inmediatamente tuvo sentido una vez que recordó que el encabezado .Net es solo una extensión del formato COFF. Tengo un excelente artículo con detalles de las ubicaciones de .Net pero no puedo encontrarlo ahora. Aquí hay una forma posiblemente mejor (no más simple) de hacerlo: http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx – user44298

+0

cont. Otra utilidad útil que encontré gracias a la investigación de su solución que puede ser útil para los visitantes http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx – user44298

+0

@ Ivo, esta es la forma más común de alojar el CLR y usar la interoperabilidad COM a través de mscoree para acceder a sus tipos. (No estoy seguro si incluso un artículo del proyecto de código es realmente útil para algo que ya está documentado en msdn http://msdn.microsoft.com/en-us/library/dd380850.aspx) Esto está perfectamente bien para muchos casos de uso, especialmente si quiere algo más que solo métodos y usa un lenguaje que tenga un buen manejo de COM como C++ o Delphi. Sin embargo, no te ayuda cuando tienes que tener una DLL "real". ;-) –

Respuesta

5

Un pequeño consejo: no tiene que hacer públicas sus exportaciones.

Su clase ya es interna, por lo que no aparecerá cuando se consuma desde otro ensamblaje.

Sin embargo, también está perfectamente bien agregar una exportación a una clase estática existente, pero declararla como privada para que no aparezca cuando se consume desde .Net. (Las exportaciones no administradas tienden a parecer un poco espeluznantes)

0

Puede hacerlo utilizando Registration COM libre. Vea mi respuesta a una pregunta sobre Registration free com here. Con un ensamblado .NET, necesita hacer COMVisible sus interfaces y métodos, como si fuera a usar el objeto usando el COM registrado. Si luego sigues mi respuesta sobre la pregunta que acabo de mencionar, deberías poder poner el dll uno al lado del otro. La única diferencia es que debe colocar información en el manifiesto de ensamblaje (el administrado) sobre las clases COM que está exportando. Si observa la documentación en el sitio de Microsoft con respecto a los manifiestos de aplicación y ensamblaje, debe averiguar cómo hacerlo. El atributo de manifiesto que está buscando es CLRClass. Si tiene todo configurado correctamente, simplemente coloque el dll administrado al lado del ejecutable de llamada y todo funciona.

Cuestiones relacionadas