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

标签 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 的一些知识,但您所说的应用程序启动和关闭是什么意思?现在我从注入(inject)远程进程的 DLL 方法调用 DotNetLoad。基本上:

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

最佳答案

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

查看重要区 block here .这让我相信,一旦将运行时加载到进程中,您就不想再做一次。

将您的初始化/取消初始化用于调用 .NET 程序集的方法中分离出来。仅执行一次初始化(在应用程序启动时和进行调用之前),并且仅执行一次取消初始化(在应用程序关闭时)。我对此进行了测试,它可以正常工作。

关于c++ - 在 C++ 中加载 CLR,Start() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605391/

相关文章:

c++ - 如何在xcode中链接glew

c++ - C++:返回具有继承对象的基于范围的循环迭代器

c++ - OpenSceneGraph 将相机设置在初始位置

windows - COM dll 不再注册

.net - 如何找出我正在使用的 CLR?

c# - 什么时候评估内插字符串?

c++ - 将数字转换为格式化字符串并再次解析格式化字符串

winapi - 同一 DLL 在一个进程中加载​​两次

com - 什么 .NET 类型编码为 COM UINT?

c# - CLR vs 运行时 vs 主机