簡體   English   中英

如何在安裝過程中正確使用NGen .NET應用程序

[英]How to properly NGen .NET application during installation

我使用Inno Setup生成我的應用程序的安裝程序,我想在安裝過程中編寫一個腳本來NGEN我的應用程序。 我希望代碼能夠針對x86x64AnyCPU NGen文件。 我希望能夠在32bit64bit系統上使用NGen 我怎樣才能做到這一點?

我發現了一些有用的鏈接:
獲取.NET Framework目錄路徑
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位系統

由於應用程序可以針對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的原生圖像,結果:=真


因此,為了使其工作,我需要知道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”

我實際上不確定64位系統上的“InstallRoot”值是否指向32位.NET或64位.NET的InstallRoot,那么前兩種方法對於任何系統都是可靠的嗎? 如何看起來像第二種方法? 有沒有更簡單的方法來實現這一切?

您使用的是哪種版本的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版的系統上擴展此常量,則會引發異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM