Загрузка сборки в смешанном режиме из неуправляемого кода

Как следует из названия, я хочу вызвать сборку смешанного режима из неуправляемого кода.

Чтобы быть более точным, я хочу динамически загрузить сборку смешанного режима, а затем выполнить некоторый статический неуправляемый код запуска, который регистрирует некоторые управляемые оболочки C++ для кода C#.

Возможно ли это (или мне нужно встроить .Net Runtime или использовать COM?)?

Кто-нибудь уже делал это и может поделиться опытом?

PS: Если сборка смешанного режима содержит окно WPF, будет ли оно запущено?


person sanosdole    schedule 24.05.2011    source источник


Ответы (1)


Вам нужно загрузить и инициализировать CLR. Да, создание управляемого класса [ComVisible] или самостоятельное размещение CLR с помощью CorBindToRuntimeEx() — это способ сделать это. Очень простой способ — экспортировать управляемую функцию из вашей DLL. Компилятор C++/CLI встраивает в код преобразователь, который заботится об инициализации CLR. Это очень просто сделать, но это плохо масштабируется, когда интерфейс вашего управляемого кода слишком толстый.

ref class Bootstrap
{
public:
    static void Initialize() { 
        // etc..
    }
};

extern "C" __declspec(dllexport) 
void __stdcall LoadAndInitialize()
{
    Bootstrap::Initialize();
}

Вы можете украсить, передав указатель функции на свой собственный интерфейс. Преобразуйте его в управляемого делегата с помощью Marshal::GetDelegateForFunctionPointer(). Не забудьте обернуть все нативные объявления с помощью #pragma manage, если вы это сделаете.

person Hans Passant    schedule 24.05.2011
comment
Будет ли CLR также инициализирована, если я не экспортирую символ, а просто выполняю некоторый статический код настройки (регистрация собственного обратного вызова)? - person sanosdole; 24.05.2011
comment
Нет, преобразователь, создаваемый компилятором C++/CLI для поддержки __declspec(dllexport) в управляемой функции, необходим. - person Hans Passant; 24.05.2011