24

.NETアプリケーションに[バージョン情報]ダイアログを追加し、表示する情報についてアセンブリの属性をクエリしています。AssemblyVersionAttributeアセンブリを使用して取得しようとすると、次のGetCustomAttribute()ようになりますnull

// Works fine
AssemblyTitleAttribute title
    = (AssemblyTitleAttribute)Attribute.GetCustomAttribute(
        someAssembly, typeof(AssemblyTitleAttribute));

// Gets null
AssemblyVersionAttribute version
    = (AssemblyVersionAttribute)Attribute.GetCustomAttribute(
        someAssembly, typeof(AssemblyVersionAttribute));

AssemblyInfo.csは元気そうです。私はこれらの属性を定義しています:

[assembly: AssemblyTitle("Some Application")]
[assembly: AssemblyVersion("1.0.0.0")]

どうしたんだ?回避策はありますが、上記のコードが機能しない理由を知りたいです。

// Work-around
string version = someAssembly.GetName().Version.ToString();
4

3 に答える 3

20

AssemblyVersionAttributeアセンブリに追加されませんが、コンパイラによって「特別な」方法で処理されます(つまり、アセンブリのバージョンを設定します)。

属性を取得できAssemblyFileVersionます(つまり、これはアセンブリに追加されます)

同じ動作を示す他の属性があります。AssemblyCultureAttributeおよびAssemblyFlagsAttributeはアセンブリプロパティの設定にも使用され、カスタム属性としてアセンブリに追加されません。

これらの属性はすべて、ドキュメントのアセンブリID属性の下にリストされています。ドキュメントには、これらの属性について次のように記載されています。

厳密な名前(該当する場合)とともに、名前、バージョン、およびカルチャの3つの属性がアセンブリのIDを決定します。

于 2009-07-17T17:05:05.803 に答える
8

あなたの例は回避策ではありません。これは、MSDNのドキュメントに記載されているとおりであり、コードは設計によるものであると私は信じています。
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx

ロードしたアセンブリの名前[sic]を取得するにはGetName、アセンブリを呼び出してを取得してからAssemblyName、プロパティを取得しVersionます。ロードしていないアセンブリの名前を取得するにはGetAssemblyName、クライアントアプリケーションから呼び出して、アプリケーションが使用しているアセンブリのバージョンを確認します。

于 2009-07-17T17:12:32.667 に答える
8

なぜこのように動作するのかわかりません。AssemblyVersionAttributeを追跡する代わりに、次のようにします。

Version AssemblyVersion = someAssembly.GetName().Version;

AssemblyFileVersionには、次のものを使用します。

Version fileVersion = new Version("0.0.0.0");
AssemblyFileVersionAttribute[] fileVersionAttributes = (AssemblyFileVersionAttribute[])assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true);
if (fileVersionAttributes != null && fileVersionAttributes.Length > 0) {
    fileVersion = new Version(fileVersionAttributes[0].Version);
}
于 2009-07-17T17:13:28.750 に答える