アプリケーションのセットアップ プログラムを生成するために使用しており、インストール中にアプリケーションのNGenInno Setup
にスクリプトを書きたいと考えています。、、または. _ _ システム上でNGenできるようにしたい。どうすればこれを達成できますか?x86
x64
AnyCPU
32bit
64bit
役立つリンクをいくつか見つけました:
.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
value1 + "v2.0." + value2 + "\ngen.exe" => win
例: "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" => win
例: "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 を指すかどうかは実際にはわかりません。最初の 2 つの方法はどのシステムでも信頼できますか? そして、2番目の2つの方法はどのように見えるでしょうか? これをすべて達成する簡単な方法はありますか?