【发布时间】:2018-09-06 20:08:02
【问题描述】:
我目前正在尝试在 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
这只是一个猜谜游戏,因为我还没有完全理解这些标志的确切作用,但不幸的是它并没有改变任何东西。
我真的不知道更多,但我想我在这里遗漏了一些重要的东西。
关于这个主题的文档和文章非常罕见,所以我希望这里的人可以帮助我或提供一些关于可能出错的提示。
【问题讨论】:
-
@omajid: .NET Core 2.1 有相当于 AppDomains 只是调用了别的东西。
-
@Joshua 你能指出我可以阅读更多相关信息的任何文档/链接吗?
-
@omajid 感谢您的链接。我在这里创建我的问题之前阅读了这篇文章,但我不太明白的是,如果不再有 AppDomain,那么为什么我可以使用 C++ 中的运行时接口创建那些,为什么甚至在官方 CoreRun 应用程序代码中创建这些?我必须查看 unix/mac 的主机代码,也许他们做了一些不同的事情。
-
@omajid:尝试在 Google 上搜索 AssemblyLoadContext