02 November 2010 Assembly, HowTo Robert Muehsig

image

Wer mal auf eine DLL ein Rechtsklick macht und auf die Detailseite der Eigenschaft schaut wird wahrscheinlich die diversen Einträge wie Versionsinfo usw. kennen. Für diese Sachen wird bei jedem Projekt eine AssemblyInfo Datei generiert. Aber auch hier kann man das Prinzip: "Don´t repeat yourself” (DRY) anwenden.

Typische Projektstruktur

Wir haben mehrere Projekte in einer Solution, welche auch untereinander irgendwie verlinkt sind. In jedem Projekt gibt es eine AssemblyInfo Datei:

image

Was steht in so einer AssemblyInfo?

Genau sowas:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("AssemblyInfoKeepItDry.Service")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("AssemblyInfoKeepItDry.Service")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("ee7c20b8-30dc-4143-bf9c-59f2d53acd85")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Redundanzen... überall!

Dabei steht dann in jeder AssemblyInfo zum Teil redundaten Daten drin, wie z.B.

  • Company
  • Product
  • Copyright

Je nachdem ob man ein Produkthaus oder ein Projekthaus ist, wird man unterschiedliche Anforderungen haben. Ich bin im Projektgeschäft tätig und bis auf Titel, Description und die Guid steht überall dasselbe drin, weil ich immer alles auf einmal ausliefere und auch sonst kein Hexenwerk mit den DLLs mache.

Was kann man machen? Lösung!

1. Eine "GlobalAssemblyInfo” Datei anlegen: Rechtsklick auf die Solution und neues Item anlegen.

2. "Globale” Sachen (das ist aber je nach Anforderung vll. verschieden) in die Datei schreiben:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;


[assembly: AssemblyCompany("Code Inside")]
[assembly: AssemblyProduct("Demoblogpost")]
[assembly: AssemblyCopyright("Copyright © Code-Inside")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

3. "Globale” Sachen aus den ursprünglichen AssemblyInfos entfernen. So sieht z.B. meine AssemblyInfo aus der Service DLL aus:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("AssemblyInfoKeepItDry.Service")]
[assembly: AssemblyDescription("")]
[assembly: Guid("ee7c20b8-30dc-4143-bf9c-59f2d53acd85")]

4. Die "GlobalAssembly” verlinken über "Add Existing Item” und zur Datei navigieren und dort explizit auf "Add as Link” drücken! (ansonsten wird eine Kopie erstellt - was den Effekt zunichte machen würde)image

image

Fertig

Damit haben wir nun die Daten an einer Stelle. Dies kann z.B. besonders nützlich sein wenn man die Versionsnummer zentral verwalten will. So kann man die Versionsnummer an einer Stelle ändern und alle DLLs werden mit derselben Versionsnummer gebaut. Einfach, aber wirkungsvoll.

[ Download Democode ]


Written by Robert Muehsig

Software Developer - from Saxony, Germany - working on primedocs.io. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de