2013-02-14 23 views
7

AssemblyInfo.csファイルは、のAssemblyVersion属性を持っていますが、私は次のように実行する場合:Reflectionを使用してAssemblyVersion属性を読み込めないのはなぜですか?

Attribute[] y = Assembly.GetExecutingAssembly().GetCustomAttributes(); 

を私が手:

System.Runtime.InteropServices.ComVisibleAttribute 
System.Runtime.CompilerServices.RuntimeCompatibilityAttribute 
System.Runtime.CompilerServices.CompilationRelaxationsAttribute 
System.Runtime.InteropServices.GuidAttribute 

System.Diagnostics.DebuggableAttribute 

System.Reflection.AssemblyTrademarkAttribute 
System.Reflection.AssemblyCopyrightAttribute 
System.Reflection.AssemblyCompanyAttribute 
System.Reflection.AssemblyConfigurationAttribute 
System.Reflection.AssemblyFileVersionAttribute 
System.Reflection.AssemblyProductAttribute 
System.Reflection.AssemblyDescriptionAttribute 

、まだ私は、この属性は、私の中に存在していることを数え切れないほどの時間をチェックしましたコード:

[assembly: AssemblyVersion("5.5.5.5")] 

...と私は直接それにアクセスしようとする場合、私は例外を取得:

Attribute x = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyVersionAttribute)); //exception 

私はその属性を使用することはできませんが、.NETはそれをどのように読んでいないのでしょうか?

+0

あなたは何をしようとしていますか? 'Assembly'は既に' Version'プロパティを持っています。 – ashes999

+0

本当ですか?その名前の静的プロパティもインスタンスプロパティも表示されません –

+1

GetName()メソッドを使用すると、Assembly.GetExecutingAssembly()。GetName()。Version; ' –

答えて

4

私はハンスアンパッサンさんのコメントを繰り返すことになります:

[のAssemblyVersion]は、.NETで、本当に大したことです。コンパイラは属性を特別に扱い、アセンブリのメタデータを生成するときにそれを使用します。実際には属性を出力しません。属性を2回実行します。図示のように、代わりにAssemblyName.Versionを使用します。

8

あなただけのアセンブリのバージョンを取得しようとしている場合、それはかなりまっすぐ進むです:

Console.WriteLine("The version of the currently executing assembly is: {0}", Assembly.GetExecutingAssembly().GetName().Version); 

プロパティがMajorMinorBuild、およびRevision性質を有するSystem.Versionの種類、です。

例:バージョン1.2.3.4のアセンブリがあります

  • Major = 1
  • Minor = 2
  • Build = 3
  • Revision = 4
0

(単に取得の味を丸めますバージョン...)

あなたは(すなわち、1つは/ランニングロードされていない)、任意のアセンブリ上のファイルバージョン情報を取得しようとしている場合は、FileVersionInfoを使用することができます - しかし、これは、メタデータで指定された同じAssemblyVersionではないかもしれないことに注意してください。

var filePath = @"c:\path-to-assembly-file"; 
FileVersionInfo info = FileVersionInfo.GetVersionInfo(filePath); 

// the following two statements are roughly equivalent 
Console.WriteLine(info.FileVersion); 
Console.WriteLine(string.Format("{0}.{1}.{2}.{3}", 
     info.FileMajorPart, 
     info.FileMinorPart, 
     info.FileBuildPart, 
     info.FilePrivatePart)); 
+0

これは[AssemblyFileVersion]です。 –

+0

@HansPassantああ、良い点。 *ファイルバージョンと反射を介して得られた "アセンブリ"バージョンとの間の潜在的な違いは... *同じものでなければならないと主張するかもしれないが... :) – JerKimball

+2

@JerKimball私は彼らの必要性について意見を異にしたい同じ。あなたが署名されたアセンブリを持っていて、同じことを保つ必要がある場合、Fileversionはアセンブリのバインディングの違いを生じません。あなたはFileversionをインクリメントして、古いアセンブリを同じアセンブリバージョンで "固定"アセンブリで動作させることができます。 –

関連する問題