【问题标题】:Unable to create multiple AppDomains无法创建多个 AppDomain
【发布时间】: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

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


【解决方案1】:

我最近做了一些关于托管和运行多个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多