|
|
Assemblies und Module
Beispiel "Multi-File-Assembly"
Assemblies fassen Module und Ressourcedateien zusammen und stellen unter .NET die (logische) Einheit für Auslieferung, Kapselung, Versionierung und Sicherheit dar.
Im Beispiel erzeugen wir zunächst aus PrivateType.cs ein Modul priv.mod .
PrivateType.cs
internal class PrivateType {
static int total = 0;
int count = 0;
internal PrivateType () { count = total++; }
internal string GetKind () { return "PRIVATE"; }
internal int GetCount () { return count; }
}
|

Anschließend generieren wir ein zweites Modul pub.mod aus PublicType.cs , wobei das Modul priv.mod verwendet wird (priv.mod bleibt aber als eigenständige Datei bestehen!)
PublicType.cs
public class PublicType {
PrivateType obj;
public PublicType () { obj = new PrivateType(); }
// Die Methode darf nicht public sein,
// weil der Typ des Argumentes o internal ist.
internal void SetObj (PrivateType o) { obj = o; }
public int GetNum () { return obj.GetCount(); }
public override string ToString () {
return "This PUBLIC object has " + obj.GetKind() + "#" + GetNum();
}
}
|

Die Hauptdatei unserer Applikation ist MFAApp.cs . Aus ihr wird nun das Manifest-Modul des Multi-File-Assemblies unter Einbindung der Module priv.mod und pub.mod erzeugt.
MFAApp.cs
using System;
public class App {
public static void Main () {
PublicType obj1 = new PublicType();
Console.WriteLine(obj1);
obj1.SetObj(new PrivateType());
Console.WriteLine(obj1);
}
}
|

Wenn wir die Applikation laufen lassen, sehen wir, dass PublicType-Objekte tatsächlich Zugriff auf PrivateType-Objekte und ihre Komponenten haben.

Beispiel "Typen aus anderen Assemblies"
Nun erstellen wir noch ein weiteres Assembly OtherApp aus OtherApp.cs , welches die beiden Typen aus MFAApp verwenden will.
OtherApp.cs
using System;
public class OtherApp {
public static void Main () {
PublicType pubObj = new PublicType();
Console.WriteLine(pubObj);
pubObj.setObj(new PrivateType());
Console.WriteLine(pubObj);
}
}
|
Bei Erzeugen des Assemblies müssen wir angeben, dass wir MFAApp verwenden wollen (/r:... ).

Das darf so natürlich nicht funktionieren, weil wir festgelegt haben, das der Typ PrivateType nur innerhalb des Assemblies sichtbar ist, in dem er definiert wurde.
Andere Applikation können also PublicType -Objekte anlegen und verwenden, aber PrivateType bleibt für sie unerreichbar.
Um OtherApp zum Laufen (bzw. Compilieren) zu bringen, müssen wir die Teile entfernen, die PrivateType verwenden.
OtherApp2.cs
using System;
public class OtherApp {
public static void Main () {
PublicType pubObj = new PublicType();
Console.WriteLine(pubObj);
}
}
|

|