Как разделить функцию Dot Net Hosting при вызове через C ++ dll - PullRequest
1 голос
/ 21 апреля 2009

Я изучаю вызов методов .net из неуправляемого кода C ++ и обнаружил следующую функцию в Как вставить управляемую сборку .NET (DLL) в другой процесс

void StartTheDotNetRuntime()
{
    // Bind to the CLR runtime..
    ICLRRuntimeHost *pClrHost = NULL;
    HRESULT hr = CorBindToRuntimeEx(
        NULL, L"wks", 0, CLSID_CLRRuntimeHost,
        IID_ICLRRuntimeHost, (PVOID*)&pClrHost);

    // Push the CLR start button
    hr = pClrHost->Start();

    // Okay, the CLR is up and running in this (previously native) process.
    // Now call a method on our managed class library.
    DWORD dwRet = 0;
    hr = pClrHost->ExecuteInDefaultAppDomain(
        L"c:\\PathToYourManagedAssembly\\MyManagedAssembly.dll",
        L"MyNamespace.MyClass", L"MyMethod", L"MyParameter", &dwRet);

    // Stop the CLR runtime
    hr = pClrHost->Stop();

    // Don't forget to clean up.
    pClrHost->Release();
}

Работает без проблем, когда вызывается один раз в консольном приложении.

Теперь я хочу разделить эту функцию для использования внутри DLL, логически это должно быть в трех частях

Method - DLLMain
    DLL_PROCESS_ATTACH
         Bind to the CLR runtime
         Push the CLR start button

    DLL_PROCESS_DETACH
         Stop the CLR runtime
         Do not forget to clean up.

Method - CallDotNetToDoSomething

Как и где я могу объявить ICLRRuntimeHost pClrHost / HRESULT hr для достижения этого?

1 Ответ

1 голос
/ 21 апреля 2009

Скорее всего, они должны быть глобальными (статическими) переменными или быть в каком-то единственном числе. Для каждого процесса разрешена только одна среда выполнения .NET (по крайней мере, в наши дни), поэтому нет смысла пытаться быть намного умнее, чем это. Заполните глобалы в загрузке DLL, а затем удалите их во время выгрузки DLL.

Для проекта встраивания .NET / Mono, который я сделал, я создал объект, конструктор которого загрузил среду выполнения (т. Е. Кнопку bind / push start), а деструктор выключил его (остановка / отпускание). Таким образом, основное приложение может выбирать, как работать, то есть помещать его в стек в main (), или делать new () во время загрузки DLL, и удалять при выгрузке DLL. В этом случае указанные вами указатели будут переменными экземпляра нового объекта, который вы создаете, например, ClrEmbedManager. Это излишне, если ваша библиотека не нуждается в повторном использовании в различных приложениях с различным поведением.

...