19

アセンブリ名またはアセンブリ クラス (またはそれに類するもの) から、アセンブリが.NETフレームワーク (つまり)の一部であるかどうかをどのように判断できSystem.windows.Formsますか?

これまで、PublicKeyToken と CodeBase のプロパティについて検討してきましたが、これらはフレームワーク全体で常に同じであるとは限りません。

この情報が必要な理由は、クライアント コンピューター上にある必要がある、EXE ファイルが使用しているアセンブリのリストを取得するためです。これにより、Visual Studio セットアップ システムを使用せずにセットアップ ファイルに正しいファイルをパッケージ化できます。問題は、.NET フレームワーク アセンブリを一切取得したくないということです。また、メジャー アップデートが終了したときに簡単にロールアウトできる自動プロセスにしたいのです。

究極の解決策は、 IsFramework プロパティがあることです... :)

4

7 に答える 7

11

いいえ、「システム」から始まりません。フレームワーク アセンブリである「WindowsBase」を確認できます。

「デフォルト」キーで署名された他の Microsoft アセンブリがあるため、PublicKeyToken も確認できませんが、それらは .NET Framework (Visual Studio アセンブリ) の一部ではありません。

これを行う最善の方法は、インストールされている .NET フレームワークのコレクションを取得し、ターゲット アセンブリがそれらの RedistList ( RedistList\FrameworkList.xml) の一部であるかどうかを確認することです。

FrameworkList.xml は次の場所にあります。

  • .NET 2.0: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RedistList
  • .NET 3.x: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v VersionNumber \RedistList
  • .NET 4.x: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\vバージョン番号\ RedistList
  • .NET コア: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v VersionNumber \RedistList
于 2009-04-14T22:02:58.467 に答える
5

これを実現するために、AssemblyProductAttribute を通じてアセンブリ内に埋め込まれた製品名を使用しています。

var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");

この手法を使用して、アプリケーションの [バージョン情報] 画面で製品ごとにアセンブリをグループ化していますが、うまく機能しているようです。

于 2010-08-12T21:14:51.167 に答える
4

私はまったく同じ問題に対処しなければなりませんでした。残念ながら、これまでのすべての回答は、アセンブリが .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')

}

この「マーカー」を使用して、アセンブリがフレームワーク アセンブリであるかどうかを確認します。公開鍵もチェックしても問題ありません。

于 2010-09-08T09:42:17.663 に答える
3

最も信頼性が高く、最も一般的な方法は、PublicKeyToken になると思います。はい、複数ありますが、有限のリストになり、頻繁に変更されることはありません。

さらに言えば、アセンブリ名のホワイトリストを作成することもできます。そのリストも、フレームワークのバージョン間で有限かつ静的になります。

于 2008-09-09T15:30:19.640 に答える
2

Visual Studioをインストールすると、フォームのさまざまなサブフォルダーに参照アセンブリが表示されますC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion}。最も興味深いのRedistList\FrameworkList.xmlは、特定のフレームワークバージョンに付属しているすべてのアセンブリ名のリストを含むファイルです。

たとえば、.NET4.0C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xmlのすべてのFrameworkアセンブリのリストが含まれているようです。

これらのファイルを使用して、アセンブリの静的ホワイトリストを簡単に確立できます。

于 2013-01-28T09:08:33.057 に答える
1

どの DLL も GAC に含まれないことがわかっている場合は、各アセンブリが GAC に含まれているかどうかを確認できます。もしそうなら、それをコピーしないでください。そうでない場合は、コピーしてください。Assembly クラスには GlobalAssemblyCache というプロパティがあります。これは明らかに、状況によっては他の状況よりもうまく機能します。

于 2010-01-06T00:02:33.027 に答える
1

リフレクションを使用してアセンブリの発行元を確認し、それをアセンブリのパスと調整できます。パブリッシャーが Microsoft で、その下のどこかに存在するアセンブリを見つけた場合、C:\Windows\Microsoft.NET\Frameworkそれはランタイムの一部であることが安全な賭けです。

考え直してみると、出版社は必要ないかもしれません。そのパスの下にあるものはすべて、ランタイムの一部である必要があります (本来あるべきではない場所で動作している不正なアプリケーションを除きます)。

于 2008-09-09T15:40:18.040 に答える