¿Cómo llamar a una DLL .NET desde un proceso Win32?
-
22-07-2019 - |
Pregunta
¿Cuáles son las opciones cuando se trata de usar una DLL .NET de un proceso Win32? Básicamente, necesito usar una DLL de C # de un proceso Win32.
Tengo una posible solución en este momento que requiere agregar la DLL de C # al GAC (usando RegAsm.exe), y luego llamar a la DLL de C # a través de llamadas COM envueltas. Sin embargo, esa solución es bastante pesada. Requiere que la DLL .NET se agregue al GAC en todos máquinas que deben ejecutar este proceso Win32.
¿Sería posible hacer esto sin tener que llamar a RegAsm
antes de poder usar el C # DLL?
Solución
Puede usar COM sin registro con componentes COM de .NET; consulte aquí .
Otra opción es usar C ++ / CLI como puente. La mayoría de las personas están familiarizadas con su uso para envolver API no administradas para exponerlas al código administrado, pero en realidad funciona en ambos sentidos: es posible compilar con / clr
y, sin embargo, producir un .dll
ensamblado con exportaciones simples no administradas, que se pueden llamar desde código no administrado como de costumbre. Aquí hay un ejemplo muy simple que expone System :: String :: ToUpper
de esa manera:
// compile with cl.exe /clr /LD wrapper.cpp ole32.lib
#include <windows.h>
__declspec(dllexport)
wchar_t* ToUpper(const wchar_t* wcs)
{
System::String^ s = gcnew System::String(wcs);
array<wchar_t>^ chars = s->ToUpper()->ToCharArray();
size_t size = chars->Length * 2;
wchar_t* dst = (wchar_t*)CoTaskMemAlloc(size + 2);
pin_ptr<wchar_t> src = &chars[0];
memcpy(dst, src, size);
dst[chars->Length] = 0;
return dst;
}
Esto producirá wrapper.dll
- ensamblado híbrido administrado / no administrado - y una biblioteca de exportación wrapper.lib
. Este último se puede usar en una aplicación nativa pura de la siguiente manera:
// compile with cl.exe test.cpp ole32.lib wrapper.lib
// note, no /clr
#include <stdio.h>
#include <windows.h>
wchar_t* ToUpper(const wchar_t* wcs);
int main()
{
wchar_t* s = ToUpper(L"foo");
wprintf(L"%s", s);
CoTaskMemFree(s);
}
En la práctica, cargará el tiempo de ejecución de CLR en el proceso de llamada (a menos que ya esté cargado allí) y se distribuirá desde el código nativo al código administrado de forma transparente: toda la magia la realiza el compilador C ++ / CLI.
Otros consejos
Hay dos opciones.
Primero, puede usar Registro de interoperabilidad COM gratuita .
Segundo, puede usar las API de alojamiento CLR para directamente aloja el CLR y carga el ensamblaje. Esto funciona sin COM.