Вопрос

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

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

Можно ли было бы сделать это без необходимости вызывать RegAsm до того, как появилась возможность использовать C # DLL?

Это было полезно?

Решение

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

Другие советы

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

Во-первых, вы можете использовать Бесплатное COM-взаимодействие при регистрации.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top