5

アプリケーションのセットアップ プログラムを生成するために使用しており、インストール中にアプリケーションのNGenInno Setupにスクリプトを書きたいと考えています。、、または. _ _ システム上でNGenできるようにしたい。どうすればこれを達成できますか?x86x64AnyCPU32bit64bit

役立つリンクをいくつか見つけました:
.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 をターゲットとするネイティブ イメージを生成します。結果 := True
    32 ビット システムでは、何もしません。結果 := False

  2. library1.dll (tcpu64, tclr40)
    64 ビット システムでは、64 ビット CPU および CLR 4.0 をターゲットとするネイティブ イメージを生成します。結果 := True
    32 ビット システムでは何もしません。結果 := False

  3. library2.dll (tcpu32, tclr20)
    64 ビット システムでは、32 ビット CPU および CLR 2.0 をターゲットとするネイティブ イメージを生成します。結果 := True
    32 ビット システムでは、64 ビット システムと同じように動作します。

  4. library3.dll (tcpu32, tclr40)
    64 ビット システムでは、32 ビット CPU および CLR 4.0 をターゲットとするネイティブ イメージを生成します。結果 := True
    32 ビット システムでは、64 ビット システムと同じように動作します。

  5. library4.dll (tcpuAny, tclr20)
    64 ビット システムでは、64 ビット CPU および CLR 2.0 をターゲットとするネイティブ イメージが生成されます。結果 := True
    32 ビット システムでは、32 ビット CPU および CLR 2.0 をターゲットとするネイティブ イメージが生成されます。結果 := True

  6. library5.dll (tcpuAny, tclr40)
    64 ビット システムでは、64 ビット CPU および CLR 4.0 をターゲットとするネイティブ イメージが生成されます。結果 := True
    32 ビット システムでは、32 ビット CPU および CLR 4.0 をターゲットとするネイティブ イメージが生成されます。結果 := True


それを機能させるには、.NET ランタイム ディレクトリへの 4 つの異なるパスを知る必要があります。これは私が見つけたものです:

  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" => win
    例: "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」の最初の値の名前を取得し、に保存します値2 値1
    + "v4.0. " + value2 + "\ngen.exe" => win
    例: "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 を指すかどうかは実際にはわかりません。最初の 2 つの方法はどのシステムでも信頼できますか? そして、2番目の2つの方法はどのように見えるでしょうか? これをすべて達成する簡単な方法はありますか?

4

1 に答える 1

4

どのバージョンのInnoSetupを使用していますか?私が使用しているバージョン(5.4.0a)には、.NETルートディレクトリを見つけるための定数がすでにあります。InnoSetupヘルプから:

{dotnet20}.NETFrameworkバージョン2.0のルートディレクトリ。インストールが64ビットモードで実行されている場合を除き、{dotnet20}は{dotnet2032}と同等です。64ビットモードの場合、{dotnet2064}と同等です。

.NET Frameworkバージョン2.0が存在しないシステムでこの定数を拡張しようとすると、例外が発生します。

{dotnet2032}32ビットの.NETFrameworkバージョン2.0のルートディレクトリ。

.NET Frameworkバージョン2.0が存在しないシステムでこの定数を拡張しようとすると、例外が発生します。

{dotnet2064} 64ビットWindowsのみ:64ビット.NETFrameworkバージョン2.0ルートディレクトリ。

.NET Frameworkバージョン2.0が存在しないシステムでこの定数を拡張しようとすると、例外が発生します。

{dotnet40}.NETFrameworkバージョン4.0のルートディレクトリ。インストールが64ビットモードで実行されている場合を除き、{dotnet40}は{dotnet4032}と同等です。64ビットモードの場合、{dotnet4064}と同等です。

.NET Frameworkバージョン4.0が存在しないシステムでこの定数を拡張しようとすると、例外が発生します。

{dotnet4032}32ビットの.NETFrameworkバージョン4.0のルートディレクトリ。

.NET Frameworkバージョン4.0が存在しないシステムでこの定数を拡張しようとすると、例外が発生します。

{dotnet4064} 64ビットWindowsのみ:64ビット.NETFrameworkバージョン4.0ルートディレクトリ。

.NET Frameworkバージョン4.0が存在しないシステムでこの定数を拡張しようとすると、例外が発生します。

于 2010-12-31T14:06:20.633 に答える