-
Notifications
You must be signed in to change notification settings - Fork 0
MS_DotNetAssemblyTargetFramework
.NET アセンブリの targetFramework を確認する方法について。
補足(なぜ確認したくなるのか): 実務でこれが必要になるのは、
たいてい次のような場面である。
場面 知りたいこと ビルド エラーの調査 参照 DLL が想定より新しいフレームワーク向けではないか 移行の棚卸し ソースが無い DLL が .NET Framework か .NET か 実行時の型読み込み失敗 netstandard2.0のつもりがnet48だった、等特に、NuGet 経由で入ってきた DLL や、
ベンダー提供でソースの無い DLL について調べる用途が多い。
ildasm を使用して .NET アセンブリの targetFramework を確認できる。
- 「開発者用コマンドプロンプト for Visual Studio」を起動する。
- ildasm コマンドを option 無しで実行すると、ildasm の GUI が起動する。
- [メニュー]の[ファイル] → [開く]から、.NET アセンブリを開く。
- 表示されたツリーの[MANIFEST]をダブルクリックする。
- MANIFEST が表示されるので以下の「TargetFrameworkAttribute」辺りを確認する。
.assembly XXXX
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = (
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = (
補足(実体は属性 1 つ): 確認しているのは、
コンパイル時にアセンブリへ自動で埋め込まれる
[assembly: TargetFramework(...)]属性である。[assembly: System.Runtime.Versioning.TargetFramework( ".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]つまり ildasm でなくても、この属性を読めばよい。
以下、GUI に頼らない方法を補足する。
補足(ildasm 以外の確認方法/最新化): ildasm は
Windows + Visual Studio が前提で、
.NET Core 以降の環境では別の手段の方が手軽なことが多い。
手段 特徴 PowerShell(リフレクション) 追加インストール不要 ilspycmd/ ILSpyクロスプラットフォーム。逆コンパイルもできる monodis --assemblyMono 系 dotnet-counters等ではなく**dotnet --info**実行環境側を見る場合 System.Reflection.Metadata自作ツールに組み込む場合 ① PowerShell で確認する(最も手軽)
# 実行せずにメタデータだけ読む(ReflectionOnly 相当) $asm = [System.Reflection.Assembly]::LoadFrom("C:\path\Foo.dll") $asm.CustomAttributes | Where-Object { $_.AttributeType.Name -eq 'TargetFrameworkAttribute' } | ForEach-Object { $_.ConstructorArguments[0].Value } # → .NETFramework,Version=v4.8
LoadFromは実際に読み込むため、依存 DLL が無いと失敗することがある。
純粋にメタデータだけ見たい場合は、次の
MetadataLoadContext(.NET Core 3.0+)を使う。var resolver = new PathAssemblyResolver(runtimeAssemblies.Append(path)); using var mlc = new MetadataLoadContext(resolver); var asm = mlc.LoadFromAssemblyPath(path); var tfm = asm.GetCustomAttributesData() .First(a => a.AttributeType.Name == "TargetFrameworkAttribute") .ConstructorArguments[0].Value;② ILSpy(CLI)で確認する
dotnet tool install -g ilspycmd ilspycmd -il Foo.dll | head -40③ ネイティブか否かも合わせて確認したい場合
# マネージド アセンブリでなければ例外になる [System.Reflection.AssemblyName]::GetAssemblyName("C:\path\Foo.dll")なお、
TargetFrameworkAttributeが無いアセンブリもある
(.NET Framework 4.0 未満でビルドされたもの、mscorlib等)。
その場合は、参照しているmscorlib/System.Runtimeの
バージョンから推定することになる。
- exe/dllが必要とする.NETのバージョンを調べる - goungoun技術系雑記帳
http://goungoun.dip.jp/app/fswiki/wiki.cgi/devnotebook?page=exe%2Fdll%A4%AC%C9%AC%CD%D7%A4%C8%A4%B9%A4%EB.NET%A4%CE%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%A4%F2%C4%B4%A4%D9%A4%EB
- 方法 : アセンブリの内容を表示する
https://learn.microsoft.com/ja-jp/dotnet/framework/app-domains/how-to-view-assembly-contents - Ildasm.exe (IL 逆アセンブラー)
https://learn.microsoft.com/ja-jp/dotnet/framework/tools/ildasm-exe-il-disassembler - TargetFrameworkAttribute クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.versioning.targetframeworkattribute - MetadataLoadContext クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.reflection.metadataloadcontext
Tags: 移行, .NET開発
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。