gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:16:52 26 4
gpt4 key购买 nike

我正在使用 Inno Setup为我的应用程序生成安装程序,我想写一个脚本到 NGen 我在安装过程中的应用程序。我希望代码能够 NGen 文件定位 x86 , x64 , 或 AnyCPU .我希望能够 NGen 32bit64bit系统。我怎样才能做到这一点?

我找到了几个有用的链接:
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);

    它会像这样工作:
  • 应用程序.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”中第一个值的名称,保存到值2
    值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”中第一个值的名称,保存到值2
    值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”值是否指向 32 位 .NET 或 64 位 .NET 的 InstallRoot,那么前两种方法对任何系统都可靠吗?第二种方法看起来如何?有没有更简单的方法来实现这一切?

    最佳答案

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

    {dotnet20} .NET Framework version 2.0 root directory. {dotnet20} is equivalent to {dotnet2032} unless the install is running in 64-bit mode, in which case it is equivalent to {dotnet2064}.

    An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 2.0 present.

    {dotnet2032} 32-bit .NET Framework version 2.0 root directory.

    An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 2.0 present.

    {dotnet2064} 64-bit Windows only: 64-bit .NET Framework version 2.0 root directory.

    An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 2.0 present.

    {dotnet40} .NET Framework version 4.0 root directory. {dotnet40} is equivalent to {dotnet4032} unless the install is running in 64-bit mode, in which case it is equivalent to {dotnet4064}.

    An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 4.0 present.

    {dotnet4032} 32-bit .NET Framework version 4.0 root directory.

    An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 4.0 present.

    {dotnet4064} 64-bit Windows only: 64-bit .NET Framework version 4.0 root directory.

    An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 4.0 present.

    关于c# - 如何在安装过程中正确使用 NGen .NET 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4558734/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com