如何在安装过程中正确正确地应用NET应用
-
14-10-2019 - |
题
我在用着 Inno Setup
要为我的应用程序生成设置程序,我想写一个脚本 ngen 我在安装过程中的应用。我希望代码能够 ngen 文件定位 x86
, x64
, , 或者 AnyCPU
. 。我想能够 ngen 上 32bit
和 64bit
系统。我该如何实现?
我找到了几个有用的链接:
获取.NET框架目录路径
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位系统相同Library.4.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 Runtime目录的4个不同的路径。这就是我发现的:
32位系统CLR 2.0
在“ HKLM Software Microsoft .netFramework”中获取“安装Root”的值,保存到Value1
获取“ HKLM Software Microsoft .netframework Policy v2.0”中的第一个值的名称,保存到Value2
Value1 +“ 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”中获取“安装Root”的值,保存到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
如何获得64位.NET框架的安装root?
示例:“ C: Windows Microsoft.net Framework64 V2.0.50727 ngen.exe”64位系统CLR 4.0
如何获得64位.NET框架的安装root?
示例:“ C: Windows Microsoft.net Framework64 V4.0.30319 ngen.exe”
实际上,我不确定64位系统上的“ install root”值是否会指向32位.NET或64位.NET的安装Root,那么对于任何系统,前2个方法是否可靠?以及第二种方法看起来如何?有什么简单的方法可以实现这一切吗?
解决方案
您正在使用什么版本的Innosetup?在我使用的版本(5.4.0a)中,已经有常数可以找到.NET root Directory。来自Innosetup的帮助:
{dotnet20} .NET Framework 2.0根目录。 {dotnet20}等于{dotnet2032},除非安装以64位模式运行,在这种情况下,它等效于{dotnet2064}。
如果尝试在没有.NET Framework 2.0版本的系统上扩展此常数,则将提出一个例外。
{dotnet2032} 32位.NET框架2.0 Root Directory。
如果尝试在没有.NET Framework 2.0版本的系统上扩展此常数,则将提出一个例外。
{dotnet2064}仅64位窗口:64位.NET框架版本2.0 root Directory。
如果尝试在没有.NET Framework 2.0版本的系统上扩展此常数,则将提出一个例外。
{dotnet40} .NET Framework版本4.0根目录。 {dotnet40}等于{dotnet4032},除非安装以64位模式运行,在这种情况下,它等效于{dotnet4064}。
如果尝试在没有.NET Framework版本4.0的系统上扩展此常数,则将提出例外。
{dotnet4032} 32位.NET框架版本4.0 root Directory。
如果尝试在没有.NET Framework版本4.0的系统上扩展此常数,则将提出例外。
{dotnet4064}仅64位窗口:64位.NET框架版本4.0 root Directory。
如果尝试在没有.NET Framework版本4.0的系统上扩展此常数,则将提出例外。