Невозможно создать несколько доменов приложений

В настоящее время я экспериментирую с размещением .NET CoreCLR в приложении C++, чтобы в основном реализовать какую-то систему плагинов.

Я использовал исходный код ядра в качестве приступить к работе и узнать, как создать собственный хост, другие учебники/документация, как правило, так или иначе терпели неудачу.
Наконец я заставил это работать, я смог инициализировать среду выполнения, создать AppDomain и выполнить сборку .NET Core.

Следующим шагом для меня было запустить несколько сборок, поэтому я просто создал вторую тестовую сборку и попытался выполнить ее так же, как и первую.
На самом деле мое приложение делает следующее:

Initialize Runtime -> Create AppDomain1 -> Execute Assembly 1 -> Unload AppDomain 1
-> Create AppDomain2 -> Execute Assembly 2 -> Unload AppDomain2

К сожалению, мне не удалось даже создать второй домен приложения.
Мой код для создания домена приложения выглядит примерно так:

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

to:

STARTUP_SERVER_GC | STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN | STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST

Это была просто игра в догадки, так как я еще не до конца понимаю, что именно делают эти флаги, но, к сожалению, это ничего не изменило.



На самом деле я больше ничего не знаю, но я думаю, что упускаю здесь что-то важное.
Документация и статьи по этой теме довольно редки, поэтому я надеюсь, что кто-то здесь может помочь мне или дать некоторые намеки на то, что может быть не так.


person TorbenJ    schedule 06.09.2018    source источник
comment
Возможный дубликат Нет доменов приложений в .NET Core! Почему?   -  person omajid    schedule 06.09.2018
comment
@omajid: .NET Core 2.1 имеет эквивалент AppDomains, который просто называется чем-то другим.   -  person Joshua    schedule 07.09.2018
comment
@Joshua Можете ли вы указать мне какие-либо документы / ссылки, где я могу прочитать об этом больше?   -  person omajid    schedule 07.09.2018
comment
@omajid спасибо за ссылку. я прочитал это до создания моего вопроса здесь, но чего я не совсем понял, так это того, что если доменов приложений больше нет, то почему я могу создавать их, используя интерфейс среды выполнения на C++, и почему они даже создаются в официальном коде приложения CoreRun? Мне нужно изучить коды хостов для unix/mac, возможно, они делают что-то другое.   -  person TorbenJ    schedule 07.09.2018
comment
@omajid: попробуйте поискать в Google AssemblyLoadContext   -  person Joshua    schedule 07.09.2018
comment
github.com/dotnet/coreclr/issues Нет лучшего места, чем это.   -  person Lex Li    schedule 07.09.2018


Ответы (1)


Недавно я провел небольшое исследование относительно хостинга и запуска нескольких доменов приложений. Вот что я нашел в Microsoft Docs и сайт GitHub

Шаг 2. Получите функции размещения .NET Core В CoreClrHost есть несколько важных методов, полезных для размещения .NET Core.

  • coreclr_initialize: запускает среду выполнения .NET Core и устанавливает домен приложения по умолчанию (и единственный).
  • coreclr_execute_assembly: выполняет управляемую сборку.
  • coreclr_create_delegate: создает указатель функции на управляемый метод.
  • coreclr_shutdown: завершает работу среды выполнения .NET Core.
  • coreclr_shutdown_2: аналогично coreclr_shutdown, но также извлекает код выхода управляемого кода.

Я понял, что это означает: «вы можете запустить только один домен приложения».

person Quantium    schedule 12.02.2020