Как правильно применение ngen .net во время установки

StackOverflow https://stackoverflow.com/questions/4558734

Вопрос

я использую Inno Setup Для создания программы настройки для моего приложения, и я хотел бы написать сценарий Ngen мое приложение во время установки. Я хочу, чтобы код смог Ngen Файлы таргетинг x86, x64, или же AnyCPU. Анкет Я хочу иметь возможность Ngen на 32bit а также 64bit система Как я могу этого добиться?

Я нашел пару полезных ссылок:
Получение пути каталога .NET Framework
http://nsis.sourceforge.net/get_directory_of_installed_.net_runtime
Где я нашел, это довольно сложная проблема - может быть до 4 разных версий Ngen заявление:

  1. Для систем CLR 2.0 и 32Bit
  2. Для систем CLR 2.0 и 64BIT
  3. Для систем CLR 4.0 и 32Bit
  4. Для систем 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);

И это сработает так:

  1. Application.exe (TCPU64, TCLR20)
    В системе 64 -битной он генерирует нативное изображение, нацеленное на 64 -битный процессор и CLR 2.0, результат: = true
    В 32 -битной системе это ничего не сделало бы, результат: = false

  2. Библиотека1.dll (TCPU64, TCLR40)
    В системе 64 -битной он генерирует нативное изображение, нацеленное на 64 -битный процессор и CLR 4.0, результат: = true
    В 32 -битной системе это ничего не сделало бы, результат: = false

  3. библиотека2.dll (TCPU32, TCLR20)
    В системе 64 -битной он генерирует нативное изображение, нацеленное на 32 -битный процессор и CLR 2.0, результат: = true
    На 32 -битной системе он будет делать то же самое, что и в 64 -битной системе

  4. Библиотека3.dll (TCPU32, TCLR40)
    В системе 64 -битной он генерирует нативное изображение, нацеленное на 32 -битный процессор и CLR 4.0, результат: = true
    На 32 -битной системе он будет делать то же самое, что и в 64 -битной системе

  5. Библиотека4.dll (Tcpuany, TCLR20)
    В системе 64 -битной он генерирует нативное изображение, нацеленное на 64 -битный процессор и CLR 2.0, результат: = true
    В 32 -битной системе он генерирует нативное изображение, нацеленное на 32 -битный процессор и CLR 2.0, результат: = true

  6. библиотека5.dll (Tcpuany, TCLR40)
    В системе 64 -битной он генерирует нативное изображение, нацеленное на 64 -битный процессор и CLR 4.0, результат: = true
    В 32 -битной системе он генерирует нативное изображение, нацеленное на 32 -битный процессор и CLR 4.0, результат: = true


Поэтому, чтобы заставить его работать, мне нужно знать 4 разных пути к каталогу выполнения .NET. Это то, что я нашел:

  1. 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 -битных системах

  2. 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 -битных системах

  3. 64 -битная система CLR 2.0
    Как получить установку для 64 -битной .NET Framework?
    Пример: "c: windows microsoft.net framework64 v2.0.50727 ngen.exe"

  4. 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top