我目前正在尝试在C ++应用程序中托管.NET CoreCLR,以基本上实现某种插件系统。
我以the corerun source code为基础来开始并探索如何构建本机主机,而其他教程/文档通常以某种方式失败。
最终,我开始运行它,可以初始化运行时,创建AppDomain并执行.NET Core程序集。
对我来说,下一步是运行多个程序集,因此我只创建了第二个测试程序集,并尝试以与第一个相同的方式执行它。
实际上,我的应用程序执行以下操作:
Initialize Runtime -> Create AppDomain1 -> Execute Assembly 1 -> Unload AppDomain 1
-> Create AppDomain2 -> Execute Assembly 2 -> Unload AppDomain2
很遗憾,我什至无法创建第二个AppDomain。
我创建AppDomain的代码大致如下:
m_RuntimeHost->CreateAppDomainWithManager
(
L"MyFriendlyName",
appDomainFlags,
nullptr,
nullptr,
sizeof(propertyKeys) / sizeof(wchar_t*),
propertyKeys,
propertyValues,
&domainId
);
我的appDomainFlags
是corerun
代码中的密码:
APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS |
APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP |
APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT
我只是假设我在此处传递的所有属性都是正确的,因为AppDomain的创建至少可以进行一次。
如果我尝试创建第二个AppDomain,我将得到HRESULT 0x80131022 (Invalid operation)
。
然后我检查了运行时界面的创建,并从以下位置替换了运行时的原始启动标志:
STARTUP_FLAGS::STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN | STARTUP_FLAGS::STARTUP_SINGLE_APPDOMAIN | STARTUP_FLAGS::STARTUP_CONCURRENT_GC
收件人:
STARTUP_SERVER_GC | STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN | STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST
这只是一个猜谜游戏,因为我还不完全了解这些标志的确切作用,但不幸的是它并没有改变任何东西。
我真的不知道更多,但是我想我在这里错过了重要的事情。
关于该主题的文档和文章非常少见,因此我希望这里的人能帮助我或提供一些可能出问题的提示。
答案 0 :(得分:0)
我最近做了一些有关托管和运行多个AppDomain的研究。这是我在Microsoft Docs和GitHub site
中找到的内容第2步-获取.NET Core托管功能CoreClrHost有几个 可用于托管.NET Core的重要方法:
coreclr_initialize
:启动.NET Core运行时并设置 默认(仅)AppDomain 。coreclr_execute_assembly
:执行托管程序集。coreclr_create_delegate
:创建指向托管方法的函数指针。coreclr_shutdown
:关闭.NET Core运行时。coreclr_shutdown_2
:与coreclr_shutdown类似,但也检索托管代码的退出代码。
我的意思是,“ 您只能启动一个AppDomain ”