2008-09-09 9 views
15

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

これまでのところ私はPublicKeyTokenとCodeBaseのプロパティを考えましたが、これらはフレームワーク全体では必ずしも同じではありません。

私がこの情報を必要とする理由は、クライアントマシン上にある必要があるEXEファイルが使用しているアセンブリのリストを取得することです。そのため、Visual Studioセットアップシステムを使用せずにセットアップファイルに正しいファイルをパッケージ化できます。問題は、.NETフレームワークアセンブリを手に入れたくないということです。主要な更新が完了するたびに簡単にロールアウトできる自動プロセスにしたいのです。

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

+0

これはどのように自動化する必要がありますか? MSからのものを取り出すのはかなり簡単です。 – RQDQ

答えて

3

私は両方の最も信頼性の高い、最も一般的な方法はなPublicKeyTokenになるだろうと思われます。はい、複数のものがありますが、それは有限のリストとなり、非常に頻繁に変更されないものになります。

そのため、アセンブリ名のホワイトリストを作成することもできます。このリストもフレームワークのバージョン間で有限でも静的でもあります。

+0

私は、公開鍵トークンのためにいくつかのMicrosoftサービスに問い合わせることができるのだろうか...リモートシンボルサーバーを提供する方法と同じように。そうすれば、手動でそれを追跡する必要はありません。 –

1

リフレクションを使用して、アセンブリのパブリッシャを調べ、アセンブリのパスと調整することができます。出版社がマイクロソフトであり、C:\Windows\Microsoft.NET\Frameworkの下に存在するアセンブリが見つかった場合、そのアセンブリはランタイムの一部です。

2番目の考えでは、出版社は必要ではないかもしれません。そのパスの下にあるものは、ランタイムの一部でなければなりません(間違っているアプリケーションで、どこにあってはならない)。

+0

ここでの問題は、AssemblyNameとAssemblyに従ってGACに多くのものがあることです。 –

3

いいえ、「システム」で始まっていません。フレームワークアセンブリである "WindowsBase"をチェックすることができます。

「既定」キーで署名された他のMicrosoftアセンブリがあるため、.NET Framework(Visual Studioアセンブリ)に含まれていないため、PublicKeyTokenも確認できません。

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

FrameworkList.xmlはで見つけることができます:

  • .NET 2.0:C:C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v2.0.50727のRedistList
  • .NET 3.xの\ \プログラムファイル(x86の)\リファレンスアセンブリ\マイクロソフト\ Frameworkの\のV のversionNumber \ RedistList
  • .NET 4.xでは:C:\プログラムファイル(x86の)\リファレンスアセンブリ\マイクロソフト\ Framework.NETFrameworkの\ V のversionNumber \ RedistList
  • .NETのコア:C:\プログラムファイル(x86の)\リファレンスアセンブリ\マイクロソフト\ Framework.NETCore \のversionNumbervご使用のDLLのどれもがGACにあなたがチェックすることができないであろうことがわかっている場合はRedistList
+0

は+1以上のものが必要です。これが本当の、正式な答えです。 –

1

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

3

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

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

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

4

私はまったく同じ問題に対処しなければなりませんでした。アセンブリが.NET Frameworkに含まれているかどうかを判断するには、残念ながらと不十分です。

Microsoftはバージョンを示すconstの文字列で、各フレームワークアセンブリのグローバル名前空間にFXAssemblyという名前のクラスを置く:

.class private abstract auto ansi sealed beforefieldinit FXAssembly 
    extends [mscorlib]System.Object 
{ 
    .field assembly static literal string Version = string('2.0.0.0') 

} 

アセンブリは、フレームワークアセンブリであるかどうかを確認するために、この「マーカー」を使用してください。公開鍵をチェックすることも害はありません。

+1

残念ながら、これはすべてのフレームワークアセンブリでは当てはまりません(例:System.Data Version 2.0.0.0は.net Framework 2.0の一部であってもそのクラスを持ちません。) 'b77a5c561934e089'の公開鍵トークンをまだチェックしています最も有望であると思われる –

+1

'b77a5c561934e089'とは別に少なくとも3つがあります:' 31bf3856ad364e35'(例:PresentationCore.dll)、 'b03f5f7f11d50a3a'(例:System.Drawing.dll)、' 89845dcd8080cc91'(例:System.Data.SqlServerCe .dll) – VitalyB

1

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のすべてのフレームワークアセンブリのリストが含まれているようです。

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

関連する問題