В настоящее время я экспериментирую с размещением .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
Это была просто игра в догадки, так как я еще не до конца понимаю, что именно делают эти флаги, но, к сожалению, это ничего не изменило.
На самом деле я больше ничего не знаю, но я думаю, что упускаю здесь что-то важное.
Документация и статьи по этой теме довольно редки, поэтому я надеюсь, что кто-то здесь может помочь мне или дать некоторые намеки на то, что может быть не так.