В настоящее время я экспериментирую с размещением .NET CoreCLR в приложении C ++, чтобы реализовать какую-то систему плагинов.
Я использовал исходный код corerun в качестве основы для начала работы и для изучения того, как создать собственный хост, другие учебные пособия / документация, как правило, так или иначе терпели неудачу.
Наконец, я получил его на работу, я мог инициализировать среду выполнения, создать домен приложения и выполнить сборку .NET Core.
Следующим шагом для меня было запустить несколько сборок, поэтому я просто создал вторую тестовую сборку и попытался выполнить ее так же, как и первую.
На самом деле мое приложение делает следующее:
Initialize Runtime -> Create AppDomain1 -> Execute Assembly 1 -> Unload AppDomain 1
-> Create AppDomain2 -> Execute Assembly 2 -> Unload AppDomain2
К сожалению, я не смог даже создать второй домен приложений.
Мой код для создания 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 работает хотя бы один раз.
Если я пытаюсь создать второй домен приложения, я просто получаю 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
Это была просто игра в догадки, так как я пока не до конца понимаю, что именно делают эти флаги, но, к сожалению, это ничего не изменило.
Я не знаю, что дальше, но я думаю, что мне здесь не хватает чего-то важного.
Документация и статьи по этой теме встречаются довольно редко, поэтому я надеюсь, что кто-то здесь может мне помочь или дать подсказки о том, что может быть не так.