インストール中に.NETアプリケーションを適切にngenする方法
-
14-10-2019 - |
質問
私は使用しています Inno Setup
アプリケーション用のセットアッププログラムを生成するために、スクリプトを書きたいと思います ngen インストール中の私のアプリケーション。コードをできるようにしたい ngen ファイルターゲティング x86
, x64
, 、 また AnyCPU
. 。できるようになりたいです ngen の上 32bit
と 64bit
システム。どうすればこれを達成できますか?
私はいくつかの有用なリンクを見つけました:
.NETフレームワークディレクトリパスを取得します
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ビットシステムでは何もしません、結果:=library1.dll (TCPU64、TCLR40)
64ビットシステムでは、64ビットCPUとCLR 4.0をターゲットにしたネイティブ画像を生成します。結果:= true
32ビットシステムでは何もしません、結果:=Library2.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"で最初の値の名前を取得します。
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"で最初の値の名前を取得します。
value1 + "v4.0。" + value2 + " ngen.exe" => win
例:「c: windows microsoft.net framework v4.0.30319 ngen.exe」
これは32ビットおよび64ビットシステムでも同じように機能すると思います64ビットシステムCLR 2.0
64bit .NETフレームワークのInstallRootを取得する方法は?
例:「c: windows microsoft.net framework64 v2.0.50727 ngen.exe」64ビットシステムCLR 4.0
64bit .NETフレームワークのInstallRootを取得する方法は?
例:「c: windows microsoft.net framework64 v4.0.30319 ngen.exe」
64ビットシステムの「InstallRoot」値が32ビット.NETまたは64bit .NETのInstallRootを指すかどうかは実際にはわかりません。そして、2番目の2つの方法のように見えますか?これらすべてを達成するためのより簡単な方法はありますか?
解決
どのバージョンのInnoSetupを使用していますか?使用するバージョン(5.4.0a)には、.NETルートディレクトリを見つけるための定数が既にあります。 InnoSetupのヘルプから:
{dotnet20} .NETフレームワークバージョン2.0ルートディレクトリ。 {dotnet20}は、インストールが64ビットモードで実行されていない限り、{dotnet2032}に相当します。その場合、{dotnet2064}に相当します。
.NETフレームワークバージョン2.0が存在しないシステム上でこの定数を拡張する試みが行われた場合、例外が提起されます。
{dotnet2032} 32-bit .netフレームワークバージョン2.0ルートディレクトリ。
.NETフレームワークバージョン2.0が存在しないシステム上でこの定数を拡張する試みが行われた場合、例外が提起されます。
{dotnet2064} 64ビットウィンドウのみ:64ビット.NETフレームワークバージョン2.0ルートディレクトリ。
.NETフレームワークバージョン2.0が存在しないシステム上でこの定数を拡張する試みが行われた場合、例外が提起されます。
{dotnet40} .netフレームワークバージョン4.0ルートディレクトリ。 {dotnet40}は、インストールが64ビットモードで実行されていない限り、{dotnet4032}に相当します。その場合、{dotnet4064}に相当します。
.NETフレームワークバージョン4.0が存在しないシステム上でこの定数を拡張する試みが行われた場合、例外が提起されます。
{dotnet4032} 32-bit .netフレームワークバージョン4.0ルートディレクトリ。
.NETフレームワークバージョン4.0が存在しないシステム上でこの定数を拡張する試みが行われた場合、例外が提起されます。
{dotnet4064} 64ビットウィンドウのみ:64ビット.NETフレームワークバージョン4.0ルートディレクトリ。
.NETフレームワークバージョン4.0が存在しないシステム上でこの定数を拡張する試みが行われた場合、例外が提起されます。