2014-01-09 11 views
6

Ich habe einige Build-Agenten, die .NET-Code für uns durch ein TeamCity-Setup erstellen, und ich frage mich, ob sie trotz der Projekteinstellungen .NET 4.5-basierte Assemblys ausgeben. Meine Zweifel rühren von der Tatsache her, dass ich nicht weiß, ob Windows 2012 Server standardmäßig mit .NET 4.5 oder 4.0 ausgeliefert wurde und ob es jemals nur 4.0 oder eine der verfügbaren 4.0-Baugruppen gab.Wie erkennen Sie, dass eine Assembly mit/für .NET 4.5 im Gegensatz zu .NET 4.0 kompiliert wurde?

Wie kann ich eine Assembly auf der Festplatte betrachten und feststellen, ob sie mit .NET 4.0 oder 4.5 erstellt wurde?

Wie aus this blog post by Marc Gravell hervorgeht, sind Unterschiede in der Art und Weise, wie diese Assemblys erstellt werden, obwohl wir tatsächlich keine .NET 4.5-Assemblys/Features verwenden.

Ich versuchte ILDASM auf der Versammlung mit, aber die Metadaten Bezug auf einen bekannten .NET 4.5 (0,1) Konsolenanwendung sagt noch 4.0:

// Metadata version: v4.0.30319 

ich die Anwendung Windows 7 mit nur .NET versucht starten 4.0 installiert, und es beginnt, aber wenn der einzige Weg, um herauszufinden, ob alles funktioniert durch Testen alles, dann würde ich lieber ein bisschen mehr versuchen, um zu sehen, ob es mit der richtigen Version zuerst gebaut wird.

So ist das möglich?

Antwort

16

Führen Sie ildasm.exe aus und schauen Sie sich das Manifest an. Sie werden sehen, die TargetFrameworkAttribute:

.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = 
(01 00 1A 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B // ....NETFramework 
    2C 56 65 72 73 69 6F 6E 3D 76 34 2E 35 01 00 54 // ,Version=v4.5..T 
    0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C // ..FrameworkDispl 
    61 79 4E 61 6D 65 12 2E 4E 45 54 20 46 72 61 6D // ayName..NET Fram 
    65 77 6F 72 6B 20 34 2E 35)      // ework 4.5 

Die CLR dieses Attribut verwendet, um sicherzustellen, dass die richtige Version auf der Maschine vorhanden ist, prompting the user es automatisch installiert, zu erhalten, wenn dies nicht der Fall.

+0

zu schnell für mich! : D Ich habe den Link zu MSDN hinzugefügt. – leppie

+0

Danke, dann produziert es 4.0 Assemblies, wie es jetzt konfiguriert ist. Eine Sorge weniger :) –

+0

Ich führte auch diese Zeile in [LINQPad] (http://linqpad.net): 'Assembly.LoadFrom (@" d: \ dev \ vs.net \ app451 \ app451 \ bin \ debug \ app451 .exe "). GetCustomAttributes (typeof (TargetFrameworkAttribute)). Dump();' und es erzeugte die Assembly-Version. –

0

Die Metadatenversion v4.0.30319 ist für .Net 4.0. Siehe here:

Generierung Versionsnummer

1,0 - 1.0.3705

1,1 - 1.1.4322.573

2,0 - 2.0.50727.42

3,0 - 3.0.4506.30

3.5 - 3.5.21022.8

4.0 - 4.0.30319.1

4.5 - 4.5.50709.17929

4.5.1 - 4.5.50938.18408

+1

Die Metadatenzeile am Anfang des Manifests in ildasm für eine .NET 4.5.1-Konsolenanwendung liest auch 4.0.30319, daher meine Frage. Die Antwort von @HansPassant gab mir jedoch meine Antwort. –