【问题标题】:How to properly NGen .NET application during installation如何在安装过程中正确安装 NGen .NET 应用程序
【发布时间】:2011-06-01 07:39:11
【问题描述】:

我正在使用Inno Setup 为我的应用程序生成安装程序,我想在安装期间为我的应用程序编写一个脚本NGen。我希望代码能够NGen 针对x86x64AnyCPU 的文件。我希望能够在32bit64bit 系统上NGen。我怎样才能做到这一点?

我找到了几个有用的链接:
Getting the .NET Framework directory path
http://nsis.sourceforge.net/Get_directory_of_installed_.NET_runtime
我发现这是一个相当复杂的问题 - NGen 应用程序最多可以有 4 个不同版本:

  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. library4.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 运行时目录的 4 个不同路径。这是我发现的:

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

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

  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”

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

【问题讨论】:

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


    【解决方案1】:

    您使用的是哪个版本的 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 版的系统上保持不变。

    【讨论】:

    • 谢谢!完全忘记了这些……+1。但是,您知道这些常量何时得到解决吗?是在第一次尝试扩展常量时,还是在设置启动时?
    • 我的猜测是在设置启动时,但我没有具体尝试过。
    • 这当然是正确的方法。我可能会从 Inno Setup 的源代码中重写代码并使用它来查找那些目录,所以感谢您指出这些常量的存在。 :-)
    • 请注意。如果在安装程序运行之前未安装 .NET,则这些不会扩展。 (如果需要,我们的安装程序会安装 .NET Framework。)因此必须使用 {win}\Microsoft.NET\Framework\v4.0.30319{win}\Microsoft.NET\Framework64\v4.0.30319
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2015-01-11
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多