Как правильно NGen .NET приложение во время установки - PullRequest
4 голосов
/ 30 декабря 2010

Я использую 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 и 32-битных систем
  2. для CLR2.0 и 64-битные системы
  3. для CLR 4.0 и 32-битные системы
  4. для CLR 4.0 и 64-битные системы

И это еще более усложняется тем, что приложение может быть нацелено32-битный процессор и работает на 64-битной системе.


Итак, мне пришла в голову функция, похожая на эту:

function NGenFile(file: String; targetCPU: TTargetCPU; targetCLR: TTargetCLR): Boolean;

и вызывающая ее где-то в [Code] после успешного isntallation:

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. library1.dll (tcpu64, tclr40)
    В 64-битной системе генерируется собственное изображение для 64-битного ЦП и CLR 4.0. Результат: = True
    В 32-битной системе ничего не происходит, Результат: = False

  3. library2.dll (tcpu32, tclr20)
    В 64-битной системе будет генерироваться собственное изображение для 32-битного ЦП и CLR 2.0, результат: = True
    В 32-битной системе это будет аналогично64-битная система

  4. library3.dll (tcpu32, tclr40)
    В 64-битной системе это будетНейтральное собственное изображение для 32-битного ЦП и CLR 4.0, Результат: = True
    В 32-битной системе он будет работать так же, как в 64-битной системе

  5. library4.dll (tcpuAny, tclr20)
    В 64-битной системе будет генерироваться собственное изображение для 64-битного ЦП и CLR 2.0, Результат: = True
    В 32-битной системе будет генерироваться собственное изображение для 32-битного ЦП и CLR 2.0, результат: = True

  6. library5.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", сохранить в значение1
    Получить имя первого значения в «HKLM \ Software \ Microsoft \ .NETFramework \ Policy \ v2.0», сохранить в значение2
    значение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 \ Policy \ v4.0», сохраните в value2
    value1 + «v4.0».+ value2 + "\ ngen.exe" => win
    Пример: "c: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ ngen.exe"
    Я предполагаю, что это будет работать на 32-битной и64-битные системы

  3. 64-битная система CLR 2.0
    Как получить InstallRoot для 64-битной .NET Framework?
    Пример: "c: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ ngen.exe "

  4. 64-битная система CLR 4.0
    Как получить InstallRoot для 64-битной .NET Framework?
    Пример: "c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ ngen.exe"

На самом деле я не уверен, что значение "InstallRoot" в 64-битных системахуказывают на InstallRoot из 32-битного .NET или 64-битного .NET, поэтому надежны ли первые 2 метода для любой системы?А как будут выглядеть вторые 2 метода?Есть ли более простой способ добиться всего этого?

1 Ответ

3 голосов
/ 31 декабря 2010

Какую версию InnoSetup вы используете?В версии, которую я использую (5.4.0a), уже есть константы для поиска корневого каталога .NET.Из справки InnoSetup:

{dotnet20} .NET Framework версии 2.0 корневой каталог.{dotnet20} эквивалентен {dotnet2032}, если установка не выполняется в 64-битном режиме, и в этом случае она эквивалентна {dotnet2064}.

Возникнет исключение, если будет предпринята попытка расширить этоконстанта в системе без .NET Framework версии 2.0.

{dotnet2032} 32-разрядный корневой каталог .NET Framework версии 2.0.

Возникнет исключение, если будет предпринята попыткаразверните эту константу в системе без .NET Framework версии 2.0.

{dotnet2064} Только для 64-битной Windows: 64-битный корневой каталог .NET Framework версии 2.0.

Исключение будетвозникает при попытке расширить эту константу в системе, в которой отсутствует .NET Framework версии 2.0.

{dotnet40} .NET Framework версии 4.0 корневой каталог.{dotnet40} эквивалентен {dotnet4032}, если установка не выполняется в 64-битном режиме, и в этом случае она эквивалентна {dotnet4064}.

Возникнет исключение, если будет предпринята попытка расширить этоконстанта в системе без .NET Framework версии 4.0.

{dotnet4032} 32-разрядный корневой каталог .NET Framework версии 4.0.

Возникнет исключение, если будет предпринята попыткаразверните эту константу в системе без .NET Framework версии 4.0.

{dotnet4064} Только для 64-битной Windows: 64-битный корневой каталог .NET Framework версии 4.0.

Исключение будетВозникает, если предпринята попытка расширить эту константу в системе, в которой отсутствует .NET Framework версии 4.0.

...