我在用着 Inno Setup 要为我的应用程序生成设置程序,我想写一个脚本 ngen 我在安装过程中的应用。我希望代码能够 ngen 文件定位 x86, x64, , 或者 AnyCPU. 。我想能够 ngen32bit64bit 系统。我该如何实现?

我找到了几个有用的链接:
获取.NET框架目录路径
http://nsis.sourceforge.net/get_directory_of_installed_.net_runtime
我发现这是一个非常复杂的问题 - 最多可以有4个不同的版本 ngen 应用:

  1. 对于CLR 2.0和32位系统
  2. 对于CLR 2.0和64位系统
  3. 对于CLR 4.0和32位系统
  4. 对于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);

它会这样起作用:

  1. application.exe (TCPU64,TCLR20)
    在64位系统上,它将生成针对64位CPU和CLR 2.0的本机图像,结果:= true
    在32位系统上,它不会做任何事情,结果:= false

  2. Library1.dll (TCPU64,TCLR40)
    在64位系统上,它将生成针对64位CPU和CLR 4.0的本机图像,结果:= true
    在32位系统上,它不会做任何事情,结果:= false

  3. library2.dll (TCPU32,TCLR20)
    在64位系统上,它将生成针对32位CPU和CLR 2.0的本机图像,结果:= true
    在32位系统上,它将与64位系统相同

  4. library3.dll (TCPU32,TCLR40)
    在64位系统上,它将生成针对32位CPU和CLR 4.0的本机图像,结果:= true
    在32位系统上,它将与64位系统相同

  5. Library.4.dll (TCPuany,TCLR20)
    在64位系统上,它将生成针对64位CPU和CLR 2.0的本机图像,结果:= true
    在32位系统上,它将生成针对32位CPU和CLR 2.0的本机图像,结果:= true

  6. Library5.dll (TCPuany,TCLR40)
    在64位系统上,它将生成针对64位CPU和CLR 4.0的本机图像,结果:= true
    在32位系统上,它将生成针对32位CPU和CLR 4.0的本机图像,结果:= true


因此,为了使其正常工作,我需要知道到.NET Runtime目录的4个不同的路径。这就是我发现的:

  1. 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位系统上使用相同

  2. 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位系统上使用相同

  3. 64位系统CLR 2.0
    如何获得64位.NET框架的安装root?
    示例:“ C: Windows Microsoft.net Framework64 V2.0.50727 ngen.exe”

  4. 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的系统上扩展此常数,则将提出例外。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top