我正在使用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 应用程序:
由于应用程序可以针对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);
它会像这样工作:
application.exe (tcpu64,tclr20)
在64位系统上,它将生成以64位CPU和CLR 2.0为目标的原生图像,结果:=真实
在32位系统上,它不会做任何事情,结果:=错误
library1.dll (tcpu64,tclr40)
在64位系统上,它将生成针对64位CPU和CLR 4.0的原生图像,结果:=真实
在32位系统上,它不会做任何事情,结果:=错误
library2.dll (tcpu32,tclr20)
在64位系统上,它将生成以32位CPU和CLR 2.0为目标的原生图像,结果:=真实
在32位系统上,它将与64位系统相同
library3.dll (tcpu32,tclr40)
在64位系统上,它将生成以32位CPU和CLR 4.0为目标的原生图像,结果:=真
在32位系统上,它将与64位系统相同
library4.dll (tcpuAny,tclr20)
在64位系统上,它将生成以64位CPU和CLR 2.0为目标的原生图像,结果:=真实
在32位系统上,它将生成以32位CPU和CLR 2.0为目标的原生图像,结果:=真
library5.dll (tcpuAny,tclr40)
在64位系统上,它将生成针对64位CPU和CLR 4.0的原生图像,结果:=真实
在32位系统上,它将生成以32位CPU和CLR 4.0为目标的原生图像,结果:=真
因此,要使其工作,我需要知道4个不同的.NET运行时目录路径。这就是我发现的:
32位系统CLR 2.0
在“HKLM \ Software \ Microsoft \ .NETFramework”中获取“InstallRoot”的值,保存到value1
在“HKLM \ Software \ Microsoft \ .NETFramework \ Policy \ v2.0”中获取第一个值的名称,保存到value2
value1 +“v2.0。” + value2 +“\ ngen.exe”=>赢得
示例:“c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ ngen.exe”
我认为这在32位和64位系统上的工作方式相同
32位系统CLR 4.0
在“HKLM \ Software \ Microsoft \ .NETFramework”中获取“InstallRoot”的值,保存到value1
在“HKLM \ Software \ Microsoft \ .NETFramework \ Policy \ v4.0”中获取第一个值的名称,保存到value2
value1 +“v4.0。” + value2 +“\ ngen.exe”=>赢得
示例:“c:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ ngen.exe”
我认为这在32位和64位系统上的工作方式相同
64位系统CLR 2.0
如何获得64位.NET Framework的InstallRoot?
示例:“c:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ ngen.exe”
64位系统CLR 4.0
如何获得64位.NET Framework的InstallRoot?
示例:“c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ ngen.exe”
我实际上不确定64位系统上的“InstallRoot”值是否指向32位.NET或64位.NET的InstallRoot,那么前两种方法对于任何系统都是可靠的吗?如何看起来像第二种方法?有没有更简单的方法来实现这一切?
答案 0 :(得分:3)
您使用的是什么版本的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版的系统上保持不变。