Как вызвать .NET DLL из процесса Win32? - PullRequest
8 голосов
/ 01 декабря 2009

Каковы варианты использования .NET DLL из процесса Win32? Мне нужно в основном использовать C # DLL из процесса Win32.

У меня есть возможное решение прямо сейчас, которое требует добавления DLL C # в GAC (с помощью RegAsm.exe), а затем вызова C # DLL через вызовы COM. Однако это решение довольно тяжелое. Требуется, чтобы .NET DLL была добавлена ​​в GAC на всех машинах, на которых предполагается запускать этот процесс Win32.

Возможно ли сделать это без необходимости вызывать RegAsm, прежде чем можно будет использовать C # DLL?

Ответы [ 2 ]

11 голосов
/ 01 декабря 2009

Вы можете использовать без регистрации 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.

7 голосов
/ 01 декабря 2009

Есть два варианта.

Во-первых, вы можете использовать Регистрация Free COM Interop .

Во-вторых, вы можете использовать API хостинга CLR для непосредственного размещения CLR и загрузки сборки. Это работает без COM.

...