DLLの.NET Frameworkバージョンを確認する


137

.NETフレームワークに対してコンパイルされ、デプロイされた古いdllがあります。コンパイルされた.NET Frameworkのバージョンがわからない。このdllがコンパイルされた.NET Frameworkのバージョンを確認するにはどうすればよいですか。Visual Studio 2008にアップグレードされ、.NET Frameworkバージョン3.5に変更されたと思われるため、ソースコードを信頼できません。


回答:


49

それをReflectorにロードして、それが何を参照しているかを確認してください

例えば:

ここに画像の説明を入力してください


1
私の考えも、リフレクターを知っているので、おそらく文句を言うだろうし、説明のない素敵なエラーアイコンを与えるだろう。
leppie

@leppie .NET 1.1であっても問題にはなりません。デフォルトのアセンブリリストを変更するだけです。
ParmesanCodice 2010

あなたの答えはとても役に立ちますが、私はそれを盲目的に依存しないことをお勧めします-昨日は.Net 4.0を対象とし、Reflectorによって。 Windowsのて、.NET 4.5 :-)私はソースを持つ以外のプロジェクトでこれを検証するための任意の方法を知らない-ここを参照してください:stackoverflow.com/questions/13214503/...
greenoldman

3
Kat Lim Ruizが指摘したように、無料のオープンソースの代替ILSpyを使用することもできます。
Marcus Mangelsdorf、

この答えは私にとってうまくいきました:stackoverflow.com/a/3461027/2961177
ckkkitty

128

PowerShellでは、次を使用してターゲットランタイムを取得できます。

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

これを、Ben Griswoldの回答からPowerShellに適合させました。

Visual Studioで指定されたターゲットフレームワークのバージョンを知りたい場合は、以下を使用します。

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

あなたは次のようなものを取得する必要があります

.NETFramework、Version = v4.5.2


4
この回答が最も役に立ちます。2003年以降のすべてのWindows OSはPowershellをサポートしています。他の多くの回答が示唆するように、追加のアプリケーションサポートを必要としない、即座にフィードバックを与えるシェル DLLの「1回限り」のチェックに最適です。あなたは男@swooganです。
Nathan McCoy

1
TargetFrameworkVersionをv3.5でビルドしたDLLに対してこれを行い、v2.0.50727を返しました。何が欠けていますか?
BHSPitMonkey 2016年

4
@BHSPitMonkeyには、実際には4つのランタイムバージョン(1.0、1.1、2.0、4.0)しかありません。.NET 3.0および3.5は、CLRバージョン2.0にコンパイルされます。msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx
Swoogan

1
このスクリプトはRuntimeVersionのみを提供します。質問はTargetFrameworkversionに関するものです。2.0、3.0、3.5に対してコンパイルされたすべてのアセンブリに対して効果的に、このスクリプトはランタイムバージョンを2.0.0.0として表示します
Kiran Vedula

3
私にとって、ReflectionOnlyLoadFromはImageRuntimeVersionを返しますが、CustomAttributesはゼロです。ReflectionOnlyLoadFromの代わりにLoadFromを使用すると、期待どおりの結果が得られます。何らかの理由?PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander

69

dotPeekは、この情報を表示するための優れた(無料の)ツールです。

Reflectorを取得する際にいくつかの問題が発生している場合、これは良い代替手段です。

ここに画像の説明を入力してください


4
参考までに、1つの問題が原因でDotPeekからJustDecompileに切り替えました。「特定のバージョン= false」を選択すると、DotPeekは空のバージョンを表示し、JustDecompileは正しいバージョンを表示します。私にとっては交換する価値がありました。
ashes999 2013年

素晴らしい-Reflectorのトライアルをインストールせずに、私が望んでいたことを正確に実行しました。
bernhardrusch

49

ILDASMを使用できます...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

出力の「メタデータセクション」を確認します。これは次のようなものです。

メタデータセクション:0x424a5342、バージョン:1.1、追加:0、バージョンlen:12、バージョン:v4.0.30319

'version'タグは、.NET Frameworkのバージョンを通知します。上記の例では4.0.30319です。


3
ここで何を探していますか?これは.NET 4.0を意味しますか?// Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX 2013年

はい、.NET 2の場合、次のようになります。//メタデータセクション:0x424a5342、バージョン:1.1、追加:0、バージョンlen:12、バージョン:v2.0.50727
Simon

17

いくつかのオプションがあります。マネージコードからプログラムで取得するには、Assembly.ImageRuntimeVersionを使用します。

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

コマンドラインから、v2.0以降、「マニフェスト」をダブルクリックして「メタデータバージョン」を探すと、ildasm.exeに表示されます。画像のCLRバージョンの確認


CurrentAppDomainのImageRuntimeVersionを取得するにはどうすればよいですか?
Kiquenet 2012


15

ただ単に

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();

1
これがなぜ反対投票されたのかはわかりませんが、スニペット(System.Runtime.Versioningへの参照が必要です)を実行して出力を正常に取得できます(これはLINQPadからのものです):TypeId typeof(TargetFrameworkAttribute)FrameworkName .NETFramework、バージョン= v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra '27 May 14 '10

このコードはフレームワークの完全版を取得しません。"4.0"は知っておくと便利ですが、たとえばRegAsm.exeにアクセスしようとする場合は、 "v4.0.30319"の方が便利です。より完全なバージョン情報は、次の場所にあります。string tar = Assembly.LoadFrom(@ "myAssembly.dll")。ImageRuntimeVersion;
マーティン

これは正しいアプローチのようですが、アセンブリにこの属性が適用されていない可能性がある状況はありますか?.NET Coreアセンブリでテストしましたが、netcoreとバージョン番号が正しく報告されます。
Adam Naylor

これは私にはうまくいきません。にはありGetCustomAttributesませんTargetFrameworkAttribute。ただし、ImageRuntimeVersionは正常に機能し、バイナリがビルドされた正しいCLRを取得します。それが構築された対象のフレームワークバージョンが必要です。
Shameel Mohamed

13

Visual Studioを介したさらに別のオプションとして、DLLへの参照を任意のプロジェクトに追加し、新しい参照を右クリックして[プロパティ]をクリックすると、ランタイムバージョンで探しているものが表示されます。

ここに画像の説明を入力してください


この質問は、DLLがVisual Studioでいつ参照されるのかではなく、PC上にある古い.NET DLLについて尋ねるものではないと思います。
ashes999 2013年

7
この回答は、PC上にある.NET DLLへの参照を追加でき、そのDLLに対応する参照の下にある項目のプロパティの1つが「ランタイムバージョン」であることを示しています。
ALEXintlsos 2013

8

ILDASMでそれを逆コンパイルし、参照されているmscorlibのバージョンを確認します(上部がほぼ正しいはずです)。


4

最も簡単な方法:任意のテキストエディターで.dllを開くだけです。最後の行の1つを見てください。 ここに画像の説明を入力してください


すべての中で最良の選択肢
Sisir

2
ただし、これは.Net 3.0以前にビルドされた
dll

2

これを行うために、このC#コンソールアプリをすぐに作成しました。

https://github.com/stuartjsmith/binarydetailer

ディレクトリをパラメータとして渡すだけで、そこにある各dllとexeのネットフレームワークがわかるように最善を尽くします


詳細な情報を提供します。これはコマンドラインアプリです。コマンドラインでディレクトリ名を渡す必要があります。
philu

2

簡単に検出」は、DiEとも呼ばれ、ファイルの種類を判別するためのプログラムです。.dllファイルまたは他の(.exe)ファイルで動作します。商用および非商用の使用については絶対に無料です。

ここに画像の説明を入力してください


0

DotPeekから持っている場合は、JetBrainsで見ることができますAssembly Explorer

このスクリーンショットを見ることができますか? im not :(


0

ここでの答えを拡張すると、依存するアセンブリがある場合、これは爆発する可能性があります。あなたが幸運で、扶養家族がいる場所がわかっている場合(または幸運なことに、GACにある)、これが役立つ場合があります...

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

リファレンス:https : //weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

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