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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top