アセンブリが .NET Framework の一部であるかどうかを判断する
-
09-06-2019 - |
質問
アセンブリ名またはアセンブリ クラス (または類似のもの) から、アセンブリがアセンブリの一部であるかどうかを判断するにはどうすればよいですか? 。ネット フレームワーク(つまり、 System.windows.Forms
)?
これまで、PublicKeyToken プロパティと CodeBase プロパティについて検討してきましたが、これらはフレームワーク全体で必ずしも同じであるとは限りません。
この情報が必要な理由は、EXE ファイルが使用している、クライアント マシン上に存在する必要があるアセンブリのリストを取得して、Visual Studio セットアップ システムを使用せずに正しいファイルをセットアップ ファイルにパッケージ化できるようにするためです。問題は、.NET Framework アセンブリを取得したくなく、メジャー アップデートが完了するたびに展開しやすい自動プロセスにしたいことです。
究極の解決策は、IsFramework プロパティがあることです...:)
解決
最も信頼性が高く、最も一般的な方法は PublicKeyToken になるのではないかと思います。はい、複数ありますが、それは有限のリストであり、あまり頻繁には変更されません。
さらに言えば、アセンブリ名のホワイトリストを作成することもできます。そのリストも、フレームワークのバージョン間で有限かつ静的になります。
他のヒント
これを実現するために、AssemblyProductAttribute を通じてアセンブリ内に埋め込まれた製品名を使用します。
var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");
私はこのテクニックを使用して、アプリケーションのバージョン情報画面でアセンブリを製品ごとにグループ化していますが、うまく機能しているようです。
私はまったく同じ問題に対処しなければなりませんでした。残念ながら、これまでに得られた答えはすべて 不十分 アセンブリが .NET Framework の一部であるかどうかを安全に判断するため。
Microsoft は、という名前のクラスを配置します。 FXAssembly
バージョンを示す const 文字列を使用して、各フレームワーク アセンブリのグローバル名前空間にコピーします。
.class private abstract auto ansi sealed beforefieldinit FXAssembly
extends [mscorlib]System.Object
{
.field assembly static literal string Version = string('2.0.0.0')
}
この「マーカー」を使用して、アセンブリがフレームワーク アセンブリであるかどうかを確認します。公開キーを確認しても問題はありません。
いいえ、「システム」から始まるわけではありません。フレームワークアセンブリである「WindowsBase」を確認できます。
「デフォルト」キーで署名された Microsoft アセンブリは他にもありますが、それらは .NET Framework (Visual Studio アセンブリ) の一部ではないため、PublicKeyToken を確認することもできません。
最善の方法は、インストールされている .NET フレームワークのコレクションを取得し、ターゲット アセンブリがその RedistList の一部であるかどうかを確認することです (RedistList\FrameworkList.xml
).
FrameworkList.xml は次の場所にあります。
- .NET 2.0:C:\Windows\Microsoft.NET\Framework64\v2.0.50727 edistList
- .NET 3.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework\vバージョンナンバー edistList
- .NET 4.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETFramework\vバージョンナンバー edistList
- .NETコア:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETCore\vバージョンナンバー edistList
DLL が GAC に存在しないことがわかっている場合は、各アセンブリが GAC に存在するかどうかを確認できます。そうであれば、コピーしないでください。そうでない場合は、コピーしてください。Assembly クラスには GlobalAssemblyCache というプロパティがあります。これは明らかに、ある状況では他の状況よりもうまく機能します。
Visual Studio をインストールすると、フォームのさまざまなサブフォルダーに参照アセンブリが取得されます。 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion}
- 最も興味深いのは、 RedistList\FrameworkList.xml
指定されたフレームワーク バージョンに同梱されているすべてのアセンブリ名のリストを含むファイル。
例えば。 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml
すべての .NET 4.0 の Framework アセンブリのリストが含まれているようです。
これらのファイルを使用して、アセンブリの静的なホワイト リストを簡単に確立できます。
リフレクションを使用してアセンブリの発行者を確認し、それをアセンブリのパスと調整することができます。発行元が Microsoft で、以下の場所に存在するアセンブリが見つかった場合 C:\Windows\Microsoft.NET\Framework
それがランタイムの一部であることは間違いありません。
よく考えてみると、出版社は必要ないかもしれません。そのパスの下にあるものはすべてランタイムの一部である必要があります (本来あるべきではない場所で動作を誤っているアプリケーションを除く)。