Я использую 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 и 32-битных систем
- для CLR2.0 и 64-битные системы
- для CLR 4.0 и 32-битные системы
- для 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);
И это будет работать так:
application.exe (tcpu64, tclr20)
В 64-битной системе она будет генерировать собственное изображение, ориентированное на 64-битный ЦП иCLR 2.0, Результат: = True
В 32-битной системе это ничего не сделает, Результат: = False
library1.dll (tcpu64, tclr40)
В 64-битной системе генерируется собственное изображение для 64-битного ЦП и CLR 4.0. Результат: = True
В 32-битной системе ничего не происходит, Результат: = False
library2.dll (tcpu32, tclr20)
В 64-битной системе будет генерироваться собственное изображение для 32-битного ЦП и CLR 2.0, результат: = True
В 32-битной системе это будет аналогично64-битная система
library3.dll (tcpu32, tclr40)
В 64-битной системе это будетНейтральное собственное изображение для 32-битного ЦП и CLR 4.0, Результат: = True
В 32-битной системе он будет работать так же, как в 64-битной системе
library4.dll (tcpuAny, tclr20)
В 64-битной системе будет генерироваться собственное изображение для 64-битного ЦП и CLR 2.0, Результат: = True
В 32-битной системе будет генерироваться собственное изображение для 32-битного ЦП и CLR 2.0, результат: = True
library5.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", сохранить в значение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-битные системы
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-битные системы
64-битная система CLR 2.0
Как получить InstallRoot для 64-битной .NET Framework?
Пример: "c: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ ngen.exe "
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 метода?Есть ли более простой способ добиться всего этого?