2010-12-16 4 views
22

Vor diesem Ausschnitt aus Blah.dll der AssemblyInfo.cs:Fileversioninfo und Assembly

[assembly: AssemblyVersion("3.3.3.3")] 
[assembly: AssemblyFileVersion("2.2.2.2")] 

Und dann in einem separaten .exe:

var fileInfo = FileVersionInfo.GetVersionInfo("/path/to/Blah.dll"); 
fileInfo.ProductVersion == fileInfo.FileVersion == true; 

Andere SO zeigen Fragen Product "richtig" zu sein, neugierig wenn es etwas seltsam ist, wie ich es benutze.

Sollen die Produktversion nicht "3.3.3.3" und FileVersion "2.2.2.2" lauten? Was würde dazu führen, dass beide Eigenschaften als AssemblyFileVersion gemeldet werden?

Danke!

+3

... und was ist die Frage? – Vlad

+0

geklärt, danke :-) – ecoffey

Antwort

38

Ich fand die Antwort ursprünglich here. Ich wiederhole die Details zur leichteren Bezugnahme.

Es gibt drei ‚Versionen‘, die in der AssemblyInfo.cs-Datei enthalten sein können:

[assembly: AssemblyVersion("1.1.1.1")] 
[assembly: AssemblyInformationalVersion("2.2.2.2")] 
[assembly: AssemblyFileVersion("3.3.3.3")] 

AssemblyInformationalVersion standardmäßig AssemblyFileVersion wenn er nicht angegeben. Ebenso sind AssemblyInformationalVersionundAssemblyFileVersion Standard zu AssemblyVersion, wenn beide nicht angegeben sind.

In Ihrem Beispiel enthielt die Datei AssemblyInfo.cs keine AssemblyInformationalVersion, daher wird standardmäßig der Wert AssemblyFileVersion verwendet. Wie Sie unten sehen werden, wird AssemblyInformationalVersion der Eigenschaft FileVersionInfo.ProductVersion zugeordnet, was erklärt, warum der Test wahr ist.

Offensichtlich gibt es ein paar frustrierende Aspekte. Erstens gibt es keine Möglichkeit (die ich kenne), die AssemblyInformationalVersion von Visual Studio zu setzen. Sie müssen die Datei AssemblyInfo.cs direkt ändern, um dieses Attribut einzuschließen. Zweitens, AssemblyInformationalVersion Karten auf die FileVersionInfo.ProductVersion Eigenschaft, die nicht intuitiv ist. Das Attribut sollte besser AssemblyProductVersion heißen.

Wie gesagt, wie erhalten wir diese Werte im Code? Wie folgt aus:

AssemblyFileVersion   => System.Diagnostics.FileVersionInfo.FileVersion 
AssemblyInformationalVersion => System.Diagnostics.FileVersionInfo.ProductVersion 
AssemblyVersion    => System.Reflection.Assembly.Version 

Im Falle AssemblyVersion, verwenden Sie diese:

string ver = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
+0

Ich akzeptierte die Antwort, weil das die richtige Erklärung ist, aber ich hatte auf eine Lösung gehofft, die das Laden (oder sogar ReflectionOnly Loading) der Baugruppe nicht beinhaltete. Aber danke, dass du das wenigstens jagst! – ecoffey

+1

Wenn Sie die Assembly-Version von einer DLL lesen möchten, ohne dass sie geladen oder nur geladen werden müssen, können Sie die Metadaten als reine Datenquelle in ein Objektmodell mit der Microsoft Common Compiler Infrastructure (CCI) lesen. Bibliothek. Sie werden sich für den MetaDataReaderHost interessieren. Es ist schnell und lädt die DLL in keinster Weise. Das hat den Vorteil, Metadaten aus DLLs lesen zu können, die mit neueren Versionen der Laufzeit kompiliert werden als Ihre Anwendung, um Ihre Anwendung zu schützen. http://ccimetadata.codeplex.com/ – Adam

+1

@ecoffey: "System.Diagnostics.FileVersionInfo.GetVersionInfo (fullPath) "lädt die Assembly nicht und Sie können" FileVersion "oder" ProductVersion "aufrufen. – user276648