1

我正在探索从非托管 C++ 代码调用 .net 方法,并在如何将托管 .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?

4

1 回答 1

1

它们应该可能是全局(静态)变量,或者是某种单例。每个进程只允许一个 .NET 运行时(至少现在是这样),因此尝试比这更聪明一点意义不大。在 DLL 加载中填充全局变量,然后在 DLL 卸载期间取消填充它们。

对于我所做的 .NET/Mono 嵌入项目,我创建了一个对象,其构造函数启动运行时(即绑定/按下启动按钮),而其析构函数将其关闭(停止/释放)。这样主应用程序可以选择如何操作,即在main() 中将其放入堆栈,或者在DLL 加载时执行new(),并在DLL 卸载时删除。在这种情况下,您提到的指针将是您创建的新对象的实例变量,例如 ClrEmbedManager。如果您的库不需要在具有不同行为的不同类型的应用程序中重用,那就太夸张了。

于 2009-04-21T16:42:43.997 回答