2010-05-17 14 views
8

En el mundo no administrado, pude escribir un __declspec (dllexport) o, alternativamente, usar un archivo .DEF para exponer una función para poder llamar a un archivo DLL. (Debido al cambio de nombre en C++ para __stdcall, puse alias en el archivo .DEF para que ciertas aplicaciones puedan volver a utilizar ciertas funciones DLL exportadas.) Ahora, estoy interesado en poder exponer una función de punto de entrada único de una Ensamblado de .NET, de forma no administrada, pero que entre en funciones de estilo .NET dentro de la DLL. ¿Es esto posible, de una manera simple y directa?¿Cómo puedo llamar a C++/CLI (.NET) DLL desde aplicaciones estándar no administradas que no son de .NET?

Lo que tengo es un programa de terceros que he extendido a través de DLL (complementos) que implementan algunas matemáticas complejas. Sin embargo, el programa de terceros no tiene medios para visualizar los cálculos. Quiero de alguna manera tomar estas funciones matemáticas escritas previamente, compilarlas en una DLL separada (pero usando C++/CLI en .NET), pero luego agregar ganchos a las funciones para que pueda representar lo que está pasando bajo el capó en .NET control de usuario. No estoy seguro de cómo mezclar las cosas de .NET con las cosas no administradas, o qué hacer con Google para lograr esta tarea.

Sugerencias específicas con respecto al puente gestionado/no gestionado, o métodos alternativos para llevar a cabo la representación de la manera que he descrito sería útil. Gracias.

Respuesta

4

¿Utiliza C++/CLI porque quiere, o porque cree que tiene que exportar funciones?

En este último caso, consulte mi unmanaged exports, que le permite declarar las exportaciones no gestionadas en C# equivalente a cómo funciona DllImport.

internal class Sample 
{ 
    [DllExport("_export_test", CallingConvention.Cdecl)] 
    static int Test(int a) 
    { 
    return a + 1; 
    } 
} 
+0

quería utilizar C++/CLI porque la biblioteca de terceros sería compilar de forma automática con sólo usar la opción/clr. Entonces agregar enlaces al framework .NET mejoraría la vida (creo). Su ejemplo parece un enfoque razonable. Gracias. – user343400

+0

No estoy seguro de que te estoy siguiendo aquí. Cuando tome mi plantilla de proyecto, también se compilará automáticamente (incluso creará un archivo .lib). Excepto si te entendí mal, y realmente quieres usar C++/CLI. –

4

Bueno, el compilador de C++/CLI hace que sea bastante fácil. Simplemente escriba una función administrada estática y asígnela con __declspec (dllexport). El compilador inyecta un stub que carga automáticamente el CLR para ejecutar el código administrado.

Ese es un enfoque útil, no es muy extensible y no será muy rápido. El siguiente paso es escribir una clase de referencia con el atributo [ComVisible (verdadero)]. Después de registrarlo con Regasm.exe, cualquier cliente ente no administrado puede usar ese servidor. Hospedar el CLR usted mismo (CorBindToRuntimeEx) suele ser la última opción, pero la más universal.


código Ejemplo:

ref class ManagedClass { 
public: 
    static void StaticFunc() {} 
}; 

extern "C" __declspec(dllexport) 
void __stdcall UnmanagedFunc() { 
    ManagedClass::StaticFunc(); 
} 
+0

Si necesito __stdcall en el nombre y quiero deshacerme del @number en el nombre de mangling y necesito crear un alias en un archivo .DEF, ¿cómo hago eso en este caso? Lo que necesito es una firma de estilo "C" externa para que pueda ser llamada por un tipo específico de aplicación de terceros. – user343400

+0

Simplemente use extern "C" y los __stdcall declarators en la exportación. No necesita un archivo .def. Muestra publicada. –

+0

@HansPassant ¿Qué quiere decir con "compilador inserta un stub"? ¿El compilador genera un .lib (y la persona que llama de UnmanagedFunc() debería vincularse con la lib)? – qqqqq

Cuestiones relacionadas