Frage

Welche Optionen sind die Optionen, wenn es darum geht, eine .NET -DLL aus einem Win32 -Prozess zu verwenden? Ich muss im Grunde genommen eine C# DLL aus einem Win32 -Prozess verwenden.

Ich habe gerade eine mögliche Lösung, die das Hinzufügen des C# DLL zum GAC (mit Regasm.exe) und dann die C# DLL über compackte Anrufe hinzufügen muss. Diese Lösung ist jedoch ziemlich schwer. Es erfordert, dass die .NET -DLL zu dem hinzugefügt wird GAC auf allen Maschinen, die diesen Win32 -Prozess ausführen sollen.

Wäre es möglich, dies zu tun, ohne anrufen zu müssen RegAsm Bevor Sie die C# DLL verwenden können?

War es hilfreich?

Lösung

Sie können registrierungsfreie com mit .net com -Komponenten verwenden - siehe hier.

Eine andere Option ist die Verwendung von C ++/CLI als Brücke. Die Leute sind größtenteils vertraut damit, sie zu verwenden, um nicht verwaltete APIs zu wickeln, um dem verwalteten Code ausgesetzt zu werden, aber es funktioniert tatsächlich in beide Richtungen - es ist möglich, mit zu kompilieren /clr, und doch eine produzieren a .dll Versammlung mit einfachen nicht verwalteten Exporten, die wie gewohnt aus nicht verwaltetem Code genannt werden können. Hier ist ein sehr einfaches Beispiel, das freigibt System::String::ToUpper dieser Weg:

// 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;
}

Dies wird produzieren wrapper.dll - Hybrid Managed/Unmanaged Assembly - und eine Exportbibliothek wrapper.lib. Letzteres kann wie folgt in einer reinen nativen Anwendung verwendet werden:

// 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 der Praxis wird die CLR -Laufzeit in den Aufrufprozess geladen (es sei denn, er ist dort bereits geladen) und den Versand vom nativen Code in den verwalteten Code transparent - die gesamte Magie erfolgt mit C ++/CLI -Compiler.

Andere Tipps

Es gibt zwei Optionen.

Zuerst können Sie verwenden Registrierung kostenlos com Interop.

Zweitens könnten Sie die verwenden CLR Hosting -APIs So hosten Sie die CLR direkt auf und laden Sie die Baugruppe. Dies funktioniert ohne com.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top