我正在使用Inno Setup为我的应用程序生成安装程序,并且我想在安装过程中向我的应用程序 NGen 编写脚本。我希望代码能够针对x86x64AnyCPU NGen 文件。我希望能够在32bit64bit系统上使用 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);
    

    它会像这样工作:
  • application.exe (tcpu64,tclr20)
    在64位系统上,它将生成针对64位CPU和CLR 2.0的 native 镜像,结果:= True
    在32位系统上,它什么也不会做,结果:= False
  • library1.dll (tcpu64,tclr40)
    在64位系统上,它将生成针对64位CPU和CLR 4.0的 native 镜像,结果:= True
    在32位系统上,它什么也不会做,结果:= False
  • library2.dll (tcpu32,tclr20)
    在64位系统上,它将生成针对32位CPU和CLR 2.0的 native 镜像,结果:= True
    在32位系统上,其作用与在64位系统上相同。
  • library3.dll (tcpu32,tclr40)
    在64位系统上,它将生成针对32位CPU和CLR 4.0的 native 镜像,结果:= True
    在32位系统上,其作用与在64位系统上相同。
  • library4.dll (tcpuAny,tclr20)
    在64位系统上,它将生成针对64位CPU和CLR 2.0的 native 镜像,结果:= True
    在32位系统上,它将生成针对32位CPU和CLR 2.0的 native 镜像,结果:= True
  • library5.dll (tcpuAny,tclr40)
    在64位系统上,它将生成针对64位CPU和CLR 4.0的 native 镜像,结果:= True
    在32位系统上,它将生成针对32位CPU和CLR 4.0的 native 镜像,结果:= True


  • 因此,要使其正常工作,我需要知道.NET运行时目录的4个不同路径。这是我发现的:
  • 32位系统CLR 2.0
    在“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位系统上正常运行
  • 32位系统CLR 4.0
    在“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位系统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”值是否指向32bit .NET或64bit .NET的InstallRoot,因此前两种方法对任何系统都可靠吗?以及后两种方法的外观如何?有没有更简单的方法来实现所有这些?

    最佳答案

    您使用的是哪个版本的InnoSetup?在我使用的版本(5.4.0a)中,已经有用于查找.NET根目录的常量。从InnoSetup帮助中:

    10-07 19:10
    查看更多