无法创建多个AppDomain

时间:2018-09-06 20:08:03

标签: c# .net .net-core coreclr

我目前正在尝试在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
);

我的appDomainFlagscorerun代码中的密码:

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

这只是一个猜谜游戏,因为我还不完全了解这些标志的确切作用,但不幸的是它并没有改变任何东西。



我真的不知道更多,但是我想我在这里错过了重要的事情。
关于该主题的文档和文章非常少见,因此我希望这里的人能帮助我或提供一些可能出问题的提示。

1 个答案:

答案 0 :(得分:0)

我最近做了一些有关托管和运行多个AppDomain的研究。这是我在Microsoft DocsGitHub 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