C++ clr Hosting - ICLRMetaHost GetRuntime уточнение версии до 4.7.2

97
10 ноября 2019, 23:00

При использовании конфигурации 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 на текущий момент.

Answer 1

Такого синтаксиса нет, потому что это несколько разные вещи. Метод 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(); 
}
READ ALSO
Лишние папки после сборки

Лишние папки после сборки

После установки CefCharp в папке сборки появились папки "x64", "x86", "GPUCache", "blob_storage"

113
Не могу перевести код (вероятно JS) в C# [закрыт]

Не могу перевести код (вероятно JS) в C# [закрыт]

Код, который нужно перенести :

111
Вопрос по генераторам

Вопрос по генераторам

Не понимаю, для чего нужна переменная $collectВызывается ли функция-генератор collect() при ее присваивании переменной $collect? Или она вызывается только...

89