Home   Cover Cover Cover Cover
 

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);
  }
}