gpt4 book ai didi

.net - 通过 C++ dll 调用时如何拆分 Dot Net Hosting 函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:19 24 4
gpt4 key购买 nike

我正在探索从非托管 C++ 代码调用 .net 方法,并在 How To Inject a Managed .NET Assembly (DLL) Into Another Process 中找到了下面的函数

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 以实现此目的?

最佳答案

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

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

关于.net - 通过 C++ dll 调用时如何拆分 Dot Net Hosting 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com