実行可能ファイルの実行に必要な.NET Frameworkのバージョンを確認するにはどうすればよいですか?


97

実行可能ファイルがあり、このファイルを開始する必要がある.NET Frameworkのバージョンを知りたいのですが。

この情報をどこかに簡単に見つける方法はありますか?

(これまでのところ、運が悪いのにILDASMDUMPBINを試しました。)



docs.microsoft.com/en-us/sysinternals/downloads-Process Explorerはこれを非常にうまく使いやすく、管理者として実行するだけです
AquaAlex

回答:


55

あなたが確実に得ることができる最も近いのは、CLRのどのバージョンが必要かを決定することだと思います。これを行うには、ILDASMを使用して「MANIFEST」ノードまたはReflectorを確認し、「Application.exe」ノードの逆アセンブルビューをILとして確認します。どちらの場合も、CLRのバージョンを示すコメントがあります。ILDASMでは、コメントは「// Metadata version」であり、Reflectorではコメントは「Target Runtime Version」です。

次に、WindowsFormsApplication1.exeという名前の.NET WinFormsアプリケーションの例を示します。

ILDASM:

// Metadata version: v2.0.50727
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.assembly extern System
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}

リフレクター:

.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727

参照されているアセンブリのリストを見て、最も高いバージョン番号の参照を探すこともできます。

繰り返しますが、ILDASMを使用して「MANIFEST」ノードデータを確認します。

.assembly extern System.Drawing
{
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
  .ver 2:0:0:0
}
.assembly extern System.Core
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 3:5:0:0
}

そして、リフレクターを使用して、リストされている各リファレンスの詳細を(まだILとして)調べます。

.assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}

最も高いバージョンのメタデータを持つ参照を見つけることで、その参照のフレームワークのバージョンを判別できます。これは、アプリケーションを実行するために同じバージョンのFrameworkをインストールする必要があることを示します。とはいえ、これを100%信頼できるものとして扱うつもりはありませんが、すぐに変わるとは思いません。


4
残念ながら、マイクロソフトは上記の手法に重大な変更を導入しています。.NET 4.5アセンブリは、生の.NET 4では実行できません。.NET4.5アセンブリに通知するには、System.Runtime.Versioning.TargetFrameworkAttributeも読み取る必要があります。lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li

55

30年前のサイズ200kbのメモ帳を使用して、あらかじめインストールされているツール:

  • で開いているアプリケーションnotepad appname.exe
  • 「フレームワーク」という単語を検索し、
  • が表示さF3れるまで最後の検索を繰り返し.NET Framework,version=vX.Yます
  • 何も見つからない場合(3.0未満のバージョン)の検索v2....ギガバイトのドットネットアナライザーツールとガベージスタジオをインストールするよりも100倍簡単です。

他のエディタ/ビューアは、メモ帳++またはtotalCommanderの偉大なテキスト/六角ビューワのように、あまりにもバイナリを開くことができますリスタ


これは素晴らしいです-特に逆コンパイル/その他のツールにアクセスできない場合
Craig

@BentTranberg興味深い。Gmailcomでasainnpをどうにかしてexeに送ってくれませんか。
Asain Kujovic


22

ILSpyを使用して、アセンブリのターゲットフレームワークを調べることができます。アセンブリを読み込んだ後、アセンブリノードのルートをクリックすると、TargetFramework宣言の下に情報が表示されます。

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]

2
TargetFrameworkAttributeは.NET 4.0でのみ追加されたため、.NET 3.5以前に対してコンパイルされたアセンブリには存在しないことに注意してください。
Wai Ha Lee

ILSpyは、読み込まれたアセンブリルートノードをクリックすると、コメントに "Runtime:vXXX"と表示されます。v1.1.4322フレームワークプロジェクトを見ることができました。
ryancdotnet 2018

15

コードから使用できますAssembly.ImageRuntimeVersionが、ファイルを確認する場合、おそらくリフレクターを使用して、参照されているのバージョンを確認することをお勧めしますmscorlib

編集:ildasm を使用してアセンブリを開き、アセンブリのマニフェストを表示することをお勧めします。マニフェストの最初の行は、アセンブリがビルドされたCLR の正確なバージョンを示します。


3
これは間違っています。OPは、CLRランタイムのバージョンではなく、.NET Frameworkのバージョンについて尋ねました。この回答は後者に対応しています。例として、CLRランタイムバージョン4.0.30139を使用するFramework 4.7.2531.0に対して実行しています。ImageRuntimeVersionは、FrameworkバージョンではなくCLRバージョンを返します。
トムバクスター

11

CorFlags.exeというツールを使用できます。これは.NET 2.0から存在し、Windows SDK 7.0に含まれていることは確かです。デフォルトでは(Windows XP Pro)、C:\ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exeにインストールされます。マネージモジュールへのファイルパス(他のコマンドラインフラグなし)を指定して、バージョンを含むヘッダー情報を表示します。

このユーティリティはモジュールのPE32ヘッダーを変更するように設計されているため、ドキュメントを注意深く読むまで、フラグを使用しないでください。


1
.Net4と.Net4.5を区別できません
mheyman


2

または、それがSystem.Coreのどの参照を持っているかを見つけることができます。これにより、このアプリが使用している.NET Frameworkのバージョンがわかります。2.0の場合、System.Coreのバージョンは2.0.xxx.xxxになります。3.5の場合、バージョンは3.5.xxx.xxxなどになります。


これは本当ではないと思います。4.5のターゲットフレームワークがありますが、System.Core 4.0.XXX.XXXを使用します
Paul Totzke

1

Linux / OSX / unixでは、以下を使用できます。

strings that_app.exe | grep 'v2.\|Framework'

1

Windowsでは、Powershellを使用して.NETバージョンのファイルを取得できます。次のスクリプト。

$path=’.\’
$ErrorActionPreference = "SilentlyContinue"
$files=Get-ChildItem -Path $path -Recurse -include *.dll,*.exe
foreach($file in $files)
{
    $filename = $file.BaseName
    $version = $([System.Reflection.Assembly]::ReflectionOnlyLoadFrom($file.FullName).GetCustomAttributesData() |
                 select-object -ExpandProperty ConstructorArguments | 
                 select-object -ExpandProperty Value | 
                 select-string -Pattern '.NET')
    Write-Output "$filename,$version"
}

次の結果が得られます。 ここに画像の説明を入力してください

結果は、そのフォルダー内のexeファイルの.NETバージョンを抽出しましたが、dllについても同じことを行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.