如何在安装过程中正确使用NGen .NET应用程序

时间:2010-12-29 23:20:51

标签: c# .net installer inno-setup ngen

我正在使用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 应用程序:

  1. 适用于CLR 2.0和32位系统
  2. 适用于CLR 2.0和64位系统
  3. 适用于CLR 4.0和32位系统
  4. 适用于CLR 4.0和64位系统
  5. 由于应用程序可以针对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为目标的原生图像,结果:=真实 在32位系统上,它不会做任何事情,结果:=错误

    2. library1.dll (tcpu64,tclr40)
      在64位系统上,它将生成针对64位CPU和CLR 4.0的原生图像,结果:=真实 在32位系统上,它不会做任何事情,结果:=错误

    3. library2.dll (tcpu32,tclr20)
      在64位系统上,它将生成以32位CPU和CLR 2.0为目标的原生图像,结果:=真实 在32位系统上,它将与64位系统相同

    4. library3.dll (tcpu32,tclr40)
      在64位系统上,它将生成以32位CPU和CLR 4.0为目标的原生图像,结果:=真
      在32位系统上,它将与64位系统相同

    5. library4.dll (tcpuAny,tclr20)
      在64位系统上,它将生成以64位CPU和CLR 2.0为目标的原生图像,结果:=真实 在32位系统上,它将生成以32位CPU和CLR 2.0为目标的原生图像,结果:=真

    6. library5.dll (tcpuAny,tclr40)
      在64位系统上,它将生成针对64位CPU和CLR 4.0的原生图像,结果:=真实 在32位系统上,它将生成以32位CPU和CLR 4.0为目标的原生图像,结果:=真


    7. 因此,要使其工作,我需要知道4个不同的.NET运行时目录路径。这就是我发现的:

      1. 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位系统上的工作方式相同

      2. 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位系统上的工作方式相同

      3. 64位系统CLR 2.0
        如何获得64位.NET Framework的InstallRoot?
        示例:“c:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ ngen.exe”

      4. 64位系统CLR 4.0
        如何获得64位.NET Framework的InstallRoot?
        示例:“c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ ngen.exe”

      5. 我实际上不确定64位系统上的“InstallRoot”值是否指向32位.NET或64位.NET的InstallRoot,那么前两种方法对于任何系统都是可靠的吗?如何看起来像第二种方法?有没有更简单的方法来实现这一切?

1 个答案:

答案 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版的系统上保持不变。