在C ++中加载CLR,Start()问题

时间:2011-07-07 03:08:13

标签: c++ com clr

所以我正在尝试加载.NET 4运行时并运行我自己的C#DLL。 Start()方法抛出HRESULT = 0x1错误。如果我注释掉开始代码,C#DLL加载并执行,则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();

    }

我理解关于解耦init,.NET调用和deinit的问题,但是你的app启动和关闭是什么意思?现在我从一个注入远程进程的DLL方法调用DotNetLoad。基本上是:

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

1 个答案:

答案 0 :(得分:1)

通过将运行时init与程序集方法调用相结合,然后运行deinit,您将在每次调用DotNetLoad()时执行此代码。

在此处查看重要的块 - http://msdn.microsoft.com/en-us/library/ms164416.aspx这让我相信,一旦您将运行时加载到您的流程中,您就不希望再次执行此操作。

拆分用于调用.NET程序集的方法的初始化/取消初始化OUT。初始化只进行一次(在应用启动时和拨打电话之前),并且只进行一次取消初始化(在应用程序关闭时)。我测试了它,它没有错误地工作。