我正在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 位系统
- 适用于 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);
它会像这样工作:
application.exe (tcpu64, tclr20)
在 64 位系统上,它会生成针对 64 位 CPU 和 CLR 2.0 的本机映像,结果:= True
在 32 位系统上它不会做任何事情,结果:= Falselibrary1.dll ( tcpu64 , tclr40)
在 64 位系统上,它会生成针对 64 位 CPU 和 CLR 4.0 的本机映像,结果:= True
在 32 位系统上它不会做任何事情,结果:= Falselibrary2.dll (tcpu32, tclr20)
在 64 位系统上,它将生成针对 32 位 CPU 和 CLR 2.0 的本机映像,结果:= True
在 32 位系统上,它与 64 位系统上的操作相同library3.dll (tcpu32, tclr40)
在 64 位系统上,它将生成针对 32 位 CPU 和 CLR 4.0 的本机映像,结果:= True
在 32 位系统上,它与 64 位系统上的操作相同library4.dll (tcpuAny, tclr20)
在 64 位系统上,它将生成针对 64 位 CPU 和 CLR 2.0 的本机映像,结果:= True
在 32 位系统上,它将生成针对 32 位 CPU 和 CLR 2.0 的本机映像,结果:= Truelibrary5.dll (tcpuAny, tclr40)
在 64 位系统上,它将生成针对 64 位 CPU 和 CLR 4.0 的本机映像,结果:= True
在 32 位系统上,它将生成针对 32 位 CPU 和 CLR 4.0 的本机映像,结果:= True
所以要让它工作,我需要知道 .NET 运行时目录的 4 个不同路径。这是我发现的:
32位系统CLR 2.0
获取“HKLM\Software\Microsoft\.NETFramework”中“InstallRoot”的值,保存到value1
获取“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
获取“HKLM\Software\Microsoft\.NETFramework”中“InstallRoot”的值,保存到value1
获取“HKLM\Software\Microsoft\.NETFramework\Policy\v4.0”中第一个值的名称,保存到值 2 值
1 + “v4.0” 。+ value2 + "\ngen.exe" => win
示例:"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,那么前两种方法对任何系统都可靠吗?第二种方法看起来如何?有没有更简单的方法来实现这一切?