Как правильно применение ngen .net во время установки
-
14-10-2019 - |
Вопрос
я использую Inno Setup
Для создания программы настройки для моего приложения, и я хотел бы написать сценарий Ngen мое приложение во время установки. Я хочу, чтобы код смог Ngen Файлы таргетинг x86
, x64
, или же AnyCPU
. Анкет Я хочу иметь возможность Ngen на 32bit
а также 64bit
система Как я могу этого добиться?
Я нашел пару полезных ссылок:
Получение пути каталога .NET Framework
http://nsis.sourceforge.net/get_directory_of_installed_.net_runtime
Где я нашел, это довольно сложная проблема - может быть до 4 разных версий Ngen заявление:
- Для систем CLR 2.0 и 32Bit
- Для систем CLR 2.0 и 64BIT
- Для систем CLR 4.0 и 32Bit
- Для систем CLR 4.0 и 64Bit
И это еще более сложно из -за того, что приложение может нацелиться на 32 -битный процессор и работать в 64 -битной системе.
Итак, что пришло мне в голову, было функцией, которая выглядела так:
function NGenFile(file: String; targetCPU: TTargetCPU; targetCLR: TTargetCLR): Boolean;
и назовите это где -нибудь в [Code]
После успешного ISnatallation:
NGenFile(ExpandConstant('{app}\application.exe'), tcpu64, tclr20);
NGenFile(ExpandConstant('{app}\library1.dll'), tcpu64, tclr40);
NGenFile(ExpandConstant('{app}\library2.dll'), tcpu32, tclr20);
NGenFile(ExpandConstant('{app}\library3.dll'), tcpu32, tclr40);
NGenFile(ExpandConstant('{app}\library4.dll'), tcpuAny, tclr20);
NGenFile(ExpandConstant('{app}\library5.dll'), tcpuAny, tclr40);
И это сработает так:
Application.exe (TCPU64, TCLR20)
В системе 64 -битной он генерирует нативное изображение, нацеленное на 64 -битный процессор и CLR 2.0, результат: = true
В 32 -битной системе это ничего не сделало бы, результат: = falseБиблиотека1.dll (TCPU64, TCLR40)
В системе 64 -битной он генерирует нативное изображение, нацеленное на 64 -битный процессор и CLR 4.0, результат: = true
В 32 -битной системе это ничего не сделало бы, результат: = falseбиблиотека2.dll (TCPU32, TCLR20)
В системе 64 -битной он генерирует нативное изображение, нацеленное на 32 -битный процессор и CLR 2.0, результат: = true
На 32 -битной системе он будет делать то же самое, что и в 64 -битной системеБиблиотека3.dll (TCPU32, TCLR40)
В системе 64 -битной он генерирует нативное изображение, нацеленное на 32 -битный процессор и CLR 4.0, результат: = true
На 32 -битной системе он будет делать то же самое, что и в 64 -битной системеБиблиотека4.dll (Tcpuany, TCLR20)
В системе 64 -битной он генерирует нативное изображение, нацеленное на 64 -битный процессор и CLR 2.0, результат: = true
В 32 -битной системе он генерирует нативное изображение, нацеленное на 32 -битный процессор и CLR 2.0, результат: = trueбиблиотека5.dll (Tcpuany, TCLR40)
В системе 64 -битной он генерирует нативное изображение, нацеленное на 64 -битный процессор и CLR 4.0, результат: = true
В 32 -битной системе он генерирует нативное изображение, нацеленное на 32 -битный процессор и CLR 4.0, результат: = true
Поэтому, чтобы заставить его работать, мне нужно знать 4 разных пути к каталогу выполнения .NET. Это то, что я нашел:
32 -битная система CLR 2.0
Получить значение «installroot» в «Hklm Software Microsoft .netframework», сохраните в Value1
Получите имя первого значения в «HKLM Software Microsoft .netFramework Police v2.0», сохранить в Value2
Значение1 + "v2.0." + value2 + " ngen.exe" => win
Пример: "c: windows microsoft.net framework v2.0.50727 ngen.exe"
Я предполагаю, что это будет работать так же на 32 -битных и 64 -битных системах32 -битная система CLR 4.0
Получить значение «installroot» в «Hklm Software Microsoft .netframework», сохраните в Value1
Получите имя первого значения в «HKLM Software Microsoft .netFramework Police v4.0», сохранить в Value2
Значение1 + "v4.0". + value2 + " ngen.exe" => win
Пример: "c: windows microsoft.net framework v4.0.30319 ngen.exe"
Я предполагаю, что это будет работать так же на 32 -битных и 64 -битных системах64 -битная система CLR 2.0
Как получить установку для 64 -битной .NET Framework?
Пример: "c: windows microsoft.net framework64 v2.0.50727 ngen.exe"64 -битная система CLR 4.0
Как получить установку для 64 -битной .NET Framework?
Пример: "C: Windows Microsoft.net Framework64 v4.0.30319 ngen.exe"
Я на самом деле не уверен, будет ли значение «установки» в 64 -битных системах на установку 32 -битного .NET или 64 -битный .NET, так же как первые 2 метода надежны для какой -либо системы? И как будет выглядеть вторым двумя методами? Есть ли более простой способ достичь всего этого?
Решение
Какую версию Innosetup вы используете? В версии, которую я использую (5.4.0a), уже есть константы, чтобы найти корневую каталог .NET. От помощи InnoSetup:
{dotnet20} .NET Framework версии 2.0 Root Directory. {dotnet20} эквивалентен {dotnet2032}, если установка не работает в 64-битном режиме, и в этом случае она эквивалентна {dotnet2064}.
Исключение будет поднято, если будет предпринята попытка расширить эту константу на системе без представленной версии 2,0 .NET .NET.
{dotnet2032} 32-битный .NET Framework версии 2.0 Root Directory.
Исключение будет поднято, если будет предпринята попытка расширить эту константу на системе без представленной версии 2,0 .NET .NET.
{dotnet2064} только 64-разрядные Windows: 64-разрядный .NET Framework версии 2.0 Root Directory.
Исключение будет поднято, если будет предпринята попытка расширить эту константу на системе без представленной версии 2,0 .NET .NET.
{dotnet40} .net Framework версии 4.0 Root Directory. {dotnet40} эквивалентен {dotnet4032}, если установка не работает в 64-битном режиме, и в этом случае она эквивалентна {dotnet4064}.
Исключение будет поднято, если будет предпринята попытка расширить эту константу на системе без представленной версии .NET Framework версии 4.0.
{dotnet4032} 32-битный .NET Framework версии 4.0 ROOT Directory.
Исключение будет поднято, если будет предпринята попытка расширить эту константу на системе без представленной версии .NET Framework версии 4.0.
{dotnet4064} 64-разрядные Windows: 64-разрядный .NET Framework версии 4.0 ROOT Directory.
Исключение будет поднято, если будет предпринята попытка расширить эту константу на системе без представленной версии .NET Framework версии 4.0.