如何在安装过程中正确安装 NGen .NET 应用程序
我正在使用 Inno Setup
为我的应用程序生成安装程序,并且我想在安装过程中为 NGen 我的应用程序编写一个脚本。我希望代码能够将 NGen 文件定位到 x86
、x64
或 AnyCPU
。我希望能够在 32 位
和 64 位
系统上NGen。我怎样才能实现这个目标?
我找到了一些有用的链接:
获取 .NET Framework 目录路径
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 的本机映像,结果 := True
在 32 位系统上它不会执行任何操作,结果 := Falselibrary1.dll (tcpu64, tclr40)
在 64 位系统上,它将生成针对 64 位 CPU 和 CLR 4.0 的本机映像,结果 := True
在 32 位系统上它不会执行任何操作,结果 := Falselibrary2.dll (tcpu32, tclr20)
在 64 位系统上,它将生成针对 32 位 CPU 和 CLR 2.0 的本机映像,结果 := True
在 32 位系统上,它会执行与 64 位系统相同的操作library3.dll(tcpu32、tclr40)
在 64 位系统上,它将生成针对 32 位 CPU 和 CLR 4.0 的本机映像,结果 := True
在 32 位系统上,它会执行与 64 位系统相同的操作library4.dll(tcpuAny、tclr20)
在 64 位系统上,它将生成针对 64 位 CPU 和 CLR 2.0 的本机映像,结果 := True
在 32 位系统上,它将生成针对 32 位 CPU 和 CLR 2.0 的本机映像,结果 := Truelibrary5.dll (tcpuAny, tclr40)
在 64 位系统上,它将生成针对 64 位 CPU 和 CLR 4.0 的本机映像,结果 := True
在 32 位系统上,它将生成针对 32 位 CPU 和 CLR 4.0 的本机映像,结果 := 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”值是否会指向 32 位 .NET 或 64 位 .NET 的 InstallRoot ,那么前两种方法对于任何系统都可靠吗?第二种方法看起来怎么样?有没有更简单的方法来实现这一切?
I'm using Inno Setup
to generate setup program for my application, and I would like to write a script to NGen my application during installation. I want the code to be able to NGen files targeting x86
, x64
, or AnyCPU
. I want to be able to NGen on 32bit
and 64bit
systems. How can I achieve this?
I've found a couple of helpful links:
Getting the .NET Framework directory path
http://nsis.sourceforge.net/Get_directory_of_installed_.NET_runtime
Where I've found it is a quite complex problem - there can be up to 4 different versions of NGen application:
- for CLR 2.0 and 32bit systems
- for CLR 2.0 and 64bit systems
- for CLR 4.0 and 32bit systems
- for CLR 4.0 and 64bit systems
And it is even more complicated by the fact the application can target 32bit CPU and run on 64bit system.
So what came to my mind was a function looking like this:
function NGenFile(file: String; targetCPU: TTargetCPU; targetCLR: TTargetCLR): Boolean;
and call it somewhere in [Code]
after successful isntallation:
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);
And it would work like this:
application.exe (tcpu64, tclr20)
On 64bit system it would generate native image targeting 64bit CPU and CLR 2.0, Result := True
On 32bit system it wouldn't do anything, Result := Falselibrary1.dll (tcpu64, tclr40)
On 64bit system it would generate native image targeting 64bit CPU and CLR 4.0, Result := True
On 32bit system it wouldn't do anything, Result := Falselibrary2.dll (tcpu32, tclr20)
On 64bit system it would generate native image targeting 32bit CPU and CLR 2.0, Result := True
On 32bit system it would do the same as on 64bit systemlibrary3.dll (tcpu32, tclr40)
On 64bit system it would generate native image targeting 32bit CPU and CLR 4.0, Result := True
On 32bit system it would do the same as on 64bit systemlibrary4.dll (tcpuAny, tclr20)
On 64bit system it would generate native image targeting 64bit CPU and CLR 2.0, Result := True
On 32bit system it would generate native image targeting 32bit CPU and CLR 2.0, Result := Truelibrary5.dll (tcpuAny, tclr40)
On 64bit system it would generate native image targeting 64bit CPU and CLR 4.0, Result := True
On 32bit system it would generate native image targeting 32bit CPU and CLR 4.0, Result := True
So to make it work, I need to know 4 different paths to .NET runtime directory. This is what I've found:
32bit system CLR 2.0
Get value of "InstallRoot" in "HKLM\Software\Microsoft\.NETFramework", save to value1
Get name of first value in "HKLM\Software\Microsoft\.NETFramework\Policy\v2.0", save to value2
value1 + "v2.0." + value2 + "\ngen.exe" => win
Example: "c:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe"
I assume this will work the same on 32bit and 64bit systems32bit system CLR 4.0
Get value of "InstallRoot" in "HKLM\Software\Microsoft\.NETFramework", save to value1
Get name of first value in "HKLM\Software\Microsoft\.NETFramework\Policy\v4.0", save to value2
value1 + "v4.0." + value2 + "\ngen.exe" => win
Example: "c:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe"
I assume this will work the same on 32bit and 64bit systems64bit system CLR 2.0
How to get InstallRoot for 64bit .NET Framework?
Example: "c:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe"64bit system CLR 4.0
How to get InstallRoot for 64bit .NET Framework?
Example: "c:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe"
I'm actually not sure if the "InstallRoot" value on 64bit systems would point to InstallRoot of 32bit .NET, or 64bit .NET, so are the first 2 methods reliable for any system? And how would look like the second 2 methods? Is there any simpler way to achieve all of this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您使用的 InnoSetup 版本是什么?在我使用的版本(5.4.0a)中,已经有用于查找.NET根目录的常量。来自 InnoSetup 帮助:
What version of InnoSetup are you using? In the version I use (5.4.0a), there are already constants for to find the .NET root directory. From the InnoSetup help: