Come chiamare una DLL .NET da un processo Win32?
-
22-07-2019 - |
Domanda
Quali sono le opzioni quando si utilizza una DLL .NET da un processo Win32? Devo fondamentalmente usare una DLL C # da un processo Win32.
Ho una possibile soluzione in questo momento che richiede l'aggiunta della DLL C # al GAC (utilizzando RegAsm.exe), quindi la chiamata della DLL C # tramite chiamate COM COM. Tuttavia, questa soluzione è piuttosto pesante. È necessario aggiungere la DLL .NET al GAC su tutti macchine che dovrebbero eseguire questo processo Win32.
Sarebbe possibile farlo senza dover chiamare RegAsm
prima di poter usare la DLL C #?
Soluzione
È possibile utilizzare COM senza registrazione con componenti COM .NET. Vedere qui .
Un'altra opzione è usare C ++ / CLI come bridge. Le persone hanno familiarità con l'uso di esso per racchiudere le API non gestite da esporre al codice gestito, ma in realtà funziona in entrambi i modi: è possibile compilare con / clr
e tuttavia produrre un .dll
assembly con semplici esportazioni non gestite, che può essere chiamato dal codice non gestito come al solito. Ecco un esempio molto semplice che espone System :: String :: ToUpper
in questo modo:
// 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;
}
Questo produrrà wrapper.dll
- assembly ibrido gestito / non gestito - e una libreria di esportazione wrapper.lib
. Quest'ultimo può essere utilizzato in un'applicazione nativa pura come segue:
// 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);
}
In pratica caricherà il runtime CLR nel processo di chiamata (a meno che non sia già caricato lì) e invii in modo trasparente dal codice nativo al codice gestito - tutta la magia è fatta dal compilatore C ++ / CLI.
Altri suggerimenti
Ci sono due opzioni.
Innanzitutto, puoi utilizzare Interoperabilità COM gratuita di registrazione .
In secondo luogo, è possibile utilizzare le API di hosting CLR per direttamente ospitare il CLR e caricare l'assembly. Funziona senza COM.