При использовании конфигурации app.exe.config можно указать желательную версию clr, например:
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>
Как то же самое уточнить для объекта ICLRMetaHost->GetRuntime(..) ?
В примерах примерно следующее:
iclrMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo));
Какой синтаксис для параметра sku по аналогии с файлом конфигурации?
Версия v4.0.30319 как я понимаю базовая, и включает все ветки от 4.0 до 4.7.2 на текущий момент.
Такого синтаксиса нет, потому что это несколько разные вещи. Метод GetRuntime принимает на вход именно версию CLR, а не версию .NET Framework. Все версии .NET 4.x используют одну и ту же версию CLR, v4.0.30319. Параметр sku в конфигурации, напротив, уточняет именно версию .NET Framework; это делается для того, чтобы в случае, когда приложение требует определенную минорную версию из набора версий 4.x, при ее отсутствии стандартный загрузчик CLR мог вывести пользователю осмысленное сообщение "Установите такую-то версию", а не просто упасть.
Если вы делаете свой загрузчик, похоже, подобный функционал придется реализовать самостоятельно, считывая версии установленных .NET из реестра и сравнивая с требуемой. Однако, судя по соседству v2.x и v4.x, вы пытаетесь сделать приложение, которое совместимо с обеими версиями и не использует никаких новшеств v4.х, поэтому этот параметр вам вовсе не нужен.
Конфигурацию для этого случая можно упростить:
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>
И соответствующий код инициализации CLR будет выглядеть так:
hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo));
if (FAILED(hr)) hr = pMetaHost->GetRuntime(L"v2.0.50727", IID_PPV_ARGS(&pRuntimeInfo));
if (FAILED(hr)) {
printf("Failed to initialize CLR: HRESULT 0x%x\n", (unsigned int)hr );
exit();
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости