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.
No tiene que estar en el GAC con la opción Regasm.exe/codebase. –