Загрузка CLR в C ++, проблема Start () - PullRequest
2 голосов
/ 07 июля 2011

Итак, я пытаюсь загрузить среду выполнения .NET 4 и запустить собственную C # DLL. Метод Start () выдает ошибку HRESULT = 0x1. Если я закомментирую стартовый код, DLL-библиотека C # загружается и выполняется, а затем метод Stop () выдает ошибку HRESULT = 0x8000ffff. Я искал несколько часов, и весь код выглядит так, как показано ниже (я упустил всю свою отладку / обработку ошибок). Большое спасибо за любые советы заранее! =) * * Тысяча одна

    void DotNetLoad()
    {
        ICLRRuntimeHost *pClrHost = NULL;
        ICLRMetaHost *lpMetaHost = NULL;
        MessageBox(0, L"Creating CLR instance.", L"Bootstrap Message", 0);
        HRESULT hr = CLRCreateInstance(
            CLSID_CLRMetaHost,
            IID_PPV_ARGS(&lpMetaHost));
        ICLRRuntimeInfo *lpRuntimeInfo = NULL;
        hr = lpMetaHost->GetRuntime(L"v4.0.30319",
            IID_PPV_ARGS(&lpRuntimeInfo));
        hr = lpRuntimeInfo->GetInterface(
            CLSID_CLRRuntimeHost,
            IID_ICLRRuntimeHost,
            (LPVOID *)&pClrHost);
        hr = pClrHost->Start();
        DWORD dwRet = 0;
        hr = pClrHost->ExecuteInDefaultAppDomain(
            pwzTargetDll,
            pwzNamespaceClass, pwzFunction, L"pwzArgument", &dwRet);
        hr = pClrHost->Stop();
        hr = pClrHost->Release();

    }

Я немного понимаю, что такое разъединение инициализации, вызова .NET и deinit, но что вы имеете в виду при запуске и завершении работы приложения? Прямо сейчас у меня DotNetLoad вызывается из метода DLL, который внедряется в удаленный процесс. В основном:

extern "C" __Declspec(dllexport) void Initialize()
{
    DotNetLoad(params); //ex.
}

1 Ответ

1 голос
/ 08 июля 2011

Комбинируя время выполнения init с вызовом метода сборки, за которым следует deinit времени выполнения, вы выполняете этот код при каждом вызове DotNetLoad ().

См. Важный блок здесь - http://msdn.microsoft.com/en-us/library/ms164416.aspxЭто заставляет меня поверить, что как только вы загрузите среду выполнения в свой процесс, вы не захотите делать это снова.

Разделить инициализацию / деинициализацию OUT метода, используемого для вызова сборки .NET.Выполните инициализацию только один раз (при запуске приложения и перед выполнением вызова) и деинициализацию только один раз (при завершении работы приложения).Я проверил это, и оно работало без ошибок.

...