我正在使用Inno Setup
为我的应用程序生成安装程序,并且我想在安装过程中向我的应用程序 NGen 编写脚本。我希望代码能够针对x86
,x64
或AnyCPU
的 NGen 文件。我希望能够在32bit
和64bit
系统上使用 NGen 。我怎样才能做到这一点?
我找到了几个有用的链接:
Getting the .NET Framework directory path
http://nsis.sourceforge.net/Get_directory_of_installed_.NET_runtime
我发现这是一个非常复杂的问题-最多可以有4个不同版本的 NGen 应用程序:
用于CLR 2.0和32位系统的
用于CLR 2.0和64位系统的
用于CLR 4.0和32位系统的
用于CLR 4.0和64位系统的
由于应用程序可以针对32位CPU并在64位系统上运行,因此情况更加复杂。
所以我想到的是一个看起来像这样的函数:
function NGenFile(file: String; targetCPU: TTargetCPU; targetCLR: TTargetCLR): Boolean;
并在成功进行归义化后在
[Code]
中的某个地方调用它: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);
它会像这样工作:
在64位系统上,它将生成针对64位CPU和CLR 2.0的 native 镜像,结果:= True
在32位系统上,它什么也不会做,结果:= False
在64位系统上,它将生成针对64位CPU和CLR 4.0的 native 镜像,结果:= True
在32位系统上,它什么也不会做,结果:= False
在64位系统上,它将生成针对32位CPU和CLR 2.0的 native 镜像,结果:= True
在32位系统上,其作用与在64位系统上相同。
在64位系统上,它将生成针对32位CPU和CLR 4.0的 native 镜像,结果:= True
在32位系统上,其作用与在64位系统上相同。
在64位系统上,它将生成针对64位CPU和CLR 2.0的 native 镜像,结果:= True
在32位系统上,它将生成针对32位CPU和CLR 2.0的 native 镜像,结果:= True
在64位系统上,它将生成针对64位CPU和CLR 4.0的 native 镜像,结果:= True
在32位系统上,它将生成针对32位CPU和CLR 4.0的 native 镜像,结果:= True
因此,要使其正常工作,我需要知道.NET运行时目录的4个不同路径。这是我发现的:
在“HKLM\Software\Microsoft\.NETFramework”中获取“InstallRoot”的值,并保存到value1
在“HKLM\Software\Microsoft\.NETFramework\Policy\v2.0”中获取第一个值的名称,保存为value2
值1 +“v2.0”。 + value2 +“\ngen.exe” =>赢得
示例:“c:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe”
我认为这将在32位和64位系统上正常运行
在“HKLM\Software\Microsoft\.NETFramework”中获取“InstallRoot”的值,并保存到value1
在“HKLM\Software\Microsoft\.NETFramework\Policy\v4.0”中获取第一个值的名称,保存为value2
值1 +“v4.0”。 + value2 +“\ngen.exe” =>赢得
示例:“c:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe”
我认为这将在32位和64位系统上正常运行
如何获得64位.NET Framework的InstallRoot?
示例:“c:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe”
如何获得64位.NET Framework的InstallRoot?
示例:“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe”
我实际上不确定64位系统上的“InstallRoot”值是否指向32bit .NET或64bit .NET的InstallRoot,因此前两种方法对任何系统都可靠吗?以及后两种方法的外观如何?有没有更简单的方法来实现所有这些?
最佳答案
您使用的是哪个版本的InnoSetup?在我使用的版本(5.4.0a)中,已经有用于查找.NET根目录的常量。从InnoSetup帮助中: