首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在安装过程中正确地使用NGen .NET应用程序

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

Stack Overflow用户
提问于 2010-12-29 23:20:51
回答 1查看 4.8K关注 0票数 5

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

我找到了几个有用的链接:

Getting the .NET Framework directory path

http://nsis.sourceforge.net/Get_directory_of_installed_.NET_runtime

我发现这是一个相当复杂的问题--最多可以有4个不同版本的NGen应用程序:

用于CLR2.0的

  1. 和用于CLR2.0的32位系统
  2. 和用于CLR4.0的64位系统
  3. 和用于CLR4.0的32位系统
  4. 和用于CLR4.0的64位系统

G 225

更复杂的是,应用程序可以针对32位CPU并在64位系统上运行。

所以我脑海中浮现的是这样一个功能:

代码语言:javascript
复制
function NGenFile(file: String; targetCPU: TTargetCPU; targetCLR: TTargetCLR): Boolean;

在成功的“理货”之后,把它称为[Code]的某个地方:

代码语言:javascript
复制
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和CLR2.0的本地映像,结果为:= True

在32位系统上,它什么也不做,结果False

  • library1.dll (tcpu64,tclr40)

在64位系统上,它将生成针对64位CPU和CLR4.0的本地映像,结果为:= True

在32位系统上,它什么也不做,结果False

  • library2.dll (tcpu32,tclr20)

在64位系统上,它将生成针对32位CPU和CLR2.0的本地映像,结果为:= True

在32位系统上,它将执行与64位system

  • library3.dll (tcpu32,tclr40)相同的操作。

在64位系统上,它将生成针对32位CPU和CLR4.0的本地映像,结果为:= True

在32位系统上,它将执行与64位system

  • library4.dll (tcpuAny,tclr20)相同的操作。

在64位系统上,它将生成针对64位CPU和CLR2.0的本地映像,结果为:= True

在32位系统上,它将生成针对32位CPU和CLR2.0的本地映像,结果True

  • library5.dll (tcpuAny,tclr40)

在64位系统上,它将生成针对64位CPU和CLR4.0的本地映像,结果为:= True

在32位系统上,它将生成针对32位CPU和CLR4.0的本地映像,结果为:= True

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

  1. 32bit系统CLR2.0

获取"InstallRoot“在"HKLM\Software\Microsoft.NETFramework”中的值,保存到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位systems

  • 32bit系统CLR4.0上也是一样的。

获取"InstallRoot“在"HKLM\Software\Microsoft.NETFramework”中的值,保存到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位systems

  • 64bit系统CLR2.0上也是一样的。

如何为64位InstallRoot框架获取.NET?

示例:"c:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe"

  • 64bit system CLR4.0

如何为64位InstallRoot框架获取.NET?

示例:"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe"

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-31 14:06:20

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

{dotnet20} .NET Framework2.0版本根目录。{dotnet20}等于{dotnet2032},除非安装以64位模式运行,在这种情况下,它等同于{dotnet2064}。

如果试图在没有.NET框架2.0版本的系统上扩展此常量,则会引发异常。

{dotnet2032} 32位.NET框架版本2.0根目录.

如果试图在没有.NET框架2.0版本的系统上扩展此常量,则会引发异常。

{dotnet2064} 64位Windows :64位.NET框架版本2.0根目录.

如果试图在没有.NET框架2.0版本的系统上扩展此常量,则会引发异常。

{dotnet40} .NET框架版本4.0根目录。{dotnet40}等于{dotnet4032},除非安装以64位模式运行,在这种情况下,它等同于{dotnet4064}。

如果试图在没有.NET Framework4.0版本的系统上扩展此常量,则会引发异常。

{dotnet4032} 32位.NET框架版本4.0根目录.

如果试图在没有.NET Framework4.0版本的系统上扩展此常量,则会引发异常。

{dotnet4064} 64位Windows :64位.NET框架版本4.0根目录.

如果试图在没有.NET Framework4.0版本的系统上扩展此常量,则会引发异常。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4558734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档