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 #?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top