Sie können registrierungsfreie COM mit .NET COM-Komponenten verwenden - siehe here.
Eine andere Option ist die Verwendung von C++/CLI als Brücke. Die meisten Leute sind damit vertraut, nicht verwaltete APIs mit verwaltetem Code zu versehen, aber es funktioniert in beide Richtungen - es ist möglich, mit /clr
zu kompilieren und dennoch eine .dll
Assembly mit einfachen nicht verwalteten Exports zu erzeugen, die aus nicht verwaltetem Code aufgerufen werden können wie gewöhnlich. Hier ist ein sehr einfaches Beispiel, das macht System::String::ToUpper
auf diese Weise:
// 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 Montage - und eine Exportbibliothek wrapper.lib
. Letzteres kann in einer reinen nativen Anwendung wie folgt 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 es CLR Laufzeit in den Anrufprozess geladen werden (es sei denn, es dort bereits geladen wird) und den Versand von nativen Code in verwaltetem Code transparent - alle Magie wird vom C++/CLI-Compiler erledigt.
Es muss nicht in der GAC mit der Option Regasm.exe/codebase sein. –