Az assembly-k minden verziószámmal kapcsolatos információja – melyet a Common Language Runtime (CLR) is használ – assembly-szinten tárolódik, az assembly manifesztjében. Amennyiben nincsenek explicit módon létrehozott, az assembly verziószámaira vonatkozó információkat tartalmazó konfigurációs állományok, akkor alapértelmezésben az assembly fordításakor generált verziószám lesz az irányadó.
A CLR futtatórendszer több lépésben ellenőrzi az assembly verziószámát, és az utoljára megtalált verziószám-forrásban lévő információ lesz a figyelembe vett adat. Első lépésben ellenőrzi az assembly-manifeszt ide vonatkozó adatait. A manifeszt tartalmát explicit eszközökkel mi is megtekinthetjük.
A mellékelt példa fordítása után, az AVLibrary projektben generált DLL adatait a legegyszerűbben a .NET Framework parancssori eszközével vizsgálhatjuk meg a legegyszerűbben. Ennek neve ILDASM.EXE. A VS.NET Command Prompt-ját elindítva gépeljük be az ildasm kulcsszót és parancssori argumentumként a DLL nevét (szükség szerint elérési útvonallal).
Amennyiben a DLL betöltődött a programban, akkor a MANIFEST csomópontra történő kattintáskor ellenőrizhetjük annak tartalmát, többek közt a verziószámot.
A megjelenő ablakban látható lesz az assembly IL kódja, melyben a .ver bekezdésben található meg az assembly aktuális verziószáma.
.assembly AVLibrary
{
...
.hash algorithm 0x00008004
.ver 2:0:0:0
}
A verziószámot manuálisan egy attribútumban adtuk az assembly-nek.
A verziószámok a .NET assembly-k esetében négy szegmensből állnak. Ezek a következők:
- Major version: az assembly fő-verziószáma.
- Minor version: az assembly mellék-verziószáma.
- Build number: fordításkor generálódó azonosító (minden fordításkor más és más).
- Revision: a CLR-től függő azonosító.
A projektek generálásakor kapunk hozzájuk egy AssemblyInfo.cs állományt, melyben adott az assembly alapértelmezett verziószámának első két száma, a következőképpen:
[assembly: AssemblyVersion("1.0.*")]
Amennyiben ezen nem változtatunk, akkor a CLR fordításkor generálja a másik két azonosítót a szegmensekbe. Például 1.0.3521.12345. Amennyiben ezt a megoldást választjuk, akkor az assembly dinamikus betöltésekor nem tudjuk lekérdezni az assembly verziószámát. A verziószám ennek ellenére tárolódik a manifeszt-ben.
Ezen azonban változtathatunk, hiszen az AssemblyInfo.cs állományban más attribútumokat is használhatunk. Ezek közül egy az AssemblyInformationalVersion attribútum, melynek segítségével egy osztály property-jét adhatjuk át paraméterként.
AVLibrary projekt
Az AVLibrary projekt által generált DLL verziószámának produkálásához létrehoztunk az AssemblyInfo.cs állományban egy osztályt, melynek Version property-je adja meg a fent említett 2.0.0.0 verziószámot. A deklaráció a következő:
public class VersionInfo
{
public const string Version = "2.0.0.0";
}
Az említett attribútumban pedig elhelyezhetjük ennek értékét paraméterként.
[assembly: AssemblyVersion(VersionInfo.Version)]
[assembly: AssemblyInformationalVersion(VersionInfo.Version)]
AVClient projekt
A kliensalkalmazásban szándékosan töröltünk minden verziószámra vonatkozó bejegyzést az AssemblyInfo.cs állományból, így az ILDASM.EXE alkalmazás segítségével megtekintett assembly manifeszt a 0.0.0.0 értéket jeleníti meg verziószámként.
Most vizsgáljuk meg, hogy miként lehet a dinamikusan betöltött DLL verziószámára vonatkozó információkat lekérdezni.
A referenciaként megadott osztály típusát felhasználva képezünk egy Assembly típusú objektumot, melynek első lépésben lekérdezzük a nevét.
Assembly a = Assembly.GetAssembly(typeof(AVLibrary.Class1));
string name = a.GetName().Name;
A következő lépésben meghívjuk a GetVersion metódust, mely visszaadja a verziószámot egy karakterlánc formájában.
label2.Text = name + " verziószáma: " + GetVersion(a);
A metódusban létrehozunk egy típust az AssemblyInfo.cs állományban használt attribútumból.
Type type = typeof(AssemblyInformationalVersionAttribute);
Lekérdezzük az assembly attribútumait, majd amennyiben találunk használható adatokat, akkor létrehozunk egy konkrét AssemblyInformationalVersionAttribute objektumot, melynek property-jei elérhetők.
if(attributeArray.Length != 0)
{
AssemblyInformationalVersionAttribute versionAttribute;
versionAttribute = (AssemblyInformationalVersionAttribute)attributeArray[0];
Az InformationalVersion property értéke adja vissza az általunk megadott verziószámot egy karakterlánc formájában.
info = versionAttribute.InformationalVersion;
...
Amennyiben a verziószám-információ nem értelmezhető, akkor az attributeArray tömb hossza nulla, vagyis nem tartalmaz használható információkat.