Вы можете использовать без регистрации COM с компонентами .NET COM - см. здесь .
Другой вариант - использовать C ++ / CLI в качестве моста. Люди в основном знакомы с его использованием для упаковки неуправляемых API-интерфейсов для предоставления доступа к управляемому коду, но на самом деле он работает в обоих направлениях - можно компилировать с /clr
, и при этом создать .dll
сборку с простым неуправляемым экспортом, вызывается из неуправляемого кода как обычно. Вот очень простой пример, который раскрывает System::String::ToUpper
таким образом:
// 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;
}
Это создаст wrapper.dll
- гибридную управляемую / неуправляемую сборку - и библиотеку экспорта wrapper.lib
. Последний может использоваться в чистом родном приложении следующим образом:
// 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);
}
На практике он загружает среду выполнения CLR в вызывающий процесс (если он там еще не загружен) и прозрачно отправляет из нативного кода в управляемый код - вся магия выполняется компилятором C ++ / CLI.