2009-12-01 16 views
8

¿Cuáles son las opciones cuando se trata de usar una DLL .NET desde un proceso de Win32? Necesito básicamente utilizar una DLL C# de un proceso Win32.Cómo llamar a una DLL .NET desde un proceso Win32?

Tengo una posible solución en este momento que requiere agregar la DLL C# al GAC (usando RegAsm.exe), y luego llamar a la DLL C# a través de llamadas envueltas COM. Sin embargo, esa solución es bastante pesada. Requiere que la DLL .NET se agregue al GAC en todas las máquinas que se supone que ejecutan este proceso Win32.

¿Sería posible hacer esto sin tener que llamar al RegAsm antes de poder usar la DLL C#?

+0

No tiene que estar en el GAC con la opción Regasm.exe/codebase. –

Respuesta

11

Puede usar un COM sin registro con componentes .NET COM - consulte here.

Otra opción es usar C++/CLI como un puente. La mayoría de las personas está familiarizada con usarlo para envolver API no administradas para exponer a código administrado, pero en realidad funciona de dos maneras: es posible compilar con /clr y producir un ensamblado .dll con exportaciones simples no administradas, que se pueden llamar desde código no administrado. como siempre. He aquí un ejemplo muy sencillo 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 - híbrido consiguió/no administrado de montaje - y una biblioteca de exportación wrapper.lib. El último puede ser utilizado 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 se carga en tiempo de ejecución CLR en el proceso de llamada (menos que ya esté cargado allí) y despacho de código nativo a código administrado de forma transparente - todo el la magia se realiza mediante el compilador C++/CLI.

+0

Esto suena muy bien, muchas gracias. Exploraré esta solución –

+0

* 'here' * apunta a [Configuración de componentes basados ​​en .NET para la activación sin registro] (https://msdn.microsoft.com/en-us/library/eew13bza (VS.71) .aspx) ... en caso de que MS decida moverlo de nuevo ... – Wolf

7

Hay dos opciones.

Primero, puede usar Registration Free COM Interop.

En segundo lugar, podría usar el CLR Hosting APIs para alojar directamente el CLR y cargar el conjunto. Esto funciona sin COM

+1

Las API de alojamiento de CLR se pueden usar de forma indirecta explotando C++/CLI. Consulte la actualización de mi respuesta. –

Cuestiones relacionadas