2012-01-22 16 views
8

He revisado ECMA 335 y solo he encontrado una referencia a la palabra clave .export que parece prometedora pero que tiene muy poca documentación. He encontrado preguntas similares sobre StackOverflow con respecto a hacer esto en C#. Sin embargo, nada de eso me ha llevado a ningún lado útil hasta ahora.¿Cómo se exporta un método en una DLL CIL para que un programa nativo pueda llamarlo?

La línea inferior es: Tengo una DLL CIL y quiero invocar algunos de sus métodos estáticos desde una aplicación C++ nativa.

Respuesta

14

En las nuevas versiones de ILASM, sólo tiene que hacer:

.method public static void Foo() 
{ 
    .export [1] 

    // code ... 
} 

este modo se exportan Foo en el índice 1 en la tabla de exportación. Los ordinales de exportación deben ser únicos y secuenciales.

En versiones anteriores, habría que hacer:

.data vt = int32 (0) [n] 
.vtfixup [n] int32 fromunmanaged at vt 

.method public static void Foo() 
{ 
    .vtentry 1:1 
    .export [1] 

    // code ... 
} 

El .vtentry indica qué VTABLE (donde 'n' es la cantidad de exportaciones que desee.): Ranura para almacenar el método en. (Las ID de tabla son secuenciales y, por lo tanto, dependen del orden de declaración.)

Los ILAms más nuevos hacen todo esto por usted, siempre que no utilice la tabla de exportación para nada más.

Tenga en cuenta que todo esto es muy poco práctico.

1

Tienes que exponer tu dll como un comdll. Com hace el trabajo de hacer la interoperabilidad nativa de .net. No puede ejecutar código IL en nada que no sea la VM de .net.

+0

Como muestra la solución de Zor, es posible sin la locura de COM. –

+0

Corrígeme si me equivoco, pero ilasm aún genera un archivo PE MSIL, aún no apto para llamadas desde una aplicación nativa. Aún necesita una VM .net para ejecutar el código. – antiduh

+1

El código administrado no se puede ejecutar mágicamente sin una máquina virtual, incluso si se llama a través de COM. Mi solución simplemente exporta métodos administrados de modo que, cuando se invocan desde un código nativo, la VM .NET ingrese y ejecute el código administrado, y luego regrese al código nativo. –

Cuestiones relacionadas