Home   Cover Cover Cover Cover
 

Virtual Execution System (VES)

Beispiel "Einfaches Probing"

Wird während der Ausführung einer Applikation ein Typ eines anderen Assemblies verwendet, muss dieses geladen werden. Sofern das noch nicht geschehen ist, wird zuerst im Global Assembly Cache (GAC) danach gesucht.
Kann es dort nicht gefunden werden und ist in den Konfigurationsdateien auch keine CodeBase (= URI, der auf die zu ladende Assemblydatei zeigt) angegeben, dann setzt das Probing ein. Dabei werden verschiedene Orte relativ zum Applikationsbasisverzeichnis nach dem Assembly durchsucht. Welche dies genau sind, soll das Beispiel zeigen.
Im Beispiel sehen wir eine simple Applikation TestLoading.exe, die eine Methode aus dem Assembly MyAssembly aufruft.

MyAssembly.cs
public class MyAssembly {
  public static void SayHello () {
    System.Console.WriteLine("Hello World!");
  }
}

TestLoading.cs
public class TestLoading {
  public static void Main () {
    MyAssembly.SayHello();
  }
}



Wir können nun MyAssembly entfernen (umbenennen), wodurch es zur Laufzeit nicht mehr gefunden wird.




In der Fehlermeldung sehen wir, dass die CLR versucht hat, MyAssembly durch Probing zu finden. Die letzten vier Zeilen zeigen, welche URIs die CLR dabei ausprobiert hat: Es werden lediglich das Applikationsbasisverzeichnis und ein darunterliegendes Verzeichnis, das denselben Name wie das gesuchte Assembly hat, nach einer Assemblydatei mit der Erweiterung .dll oder .exe durchsucht.

Beispiel "Probing mit Suchpfad"

Im einfachen Fall (siehe Beispiel "Einfaches Probing") wird beim Probing lediglich das Applikationsbasisverzeichnis und ein darunterliegendes Verzeichnis, das denselben Name wie das gesuchte Assembly hat, nach einer Assemblydatei mit den Erweiterung .dll oder .exe durchsucht.
In der Applikationskonfigurationsdatei (TestLoading.exe.config) kann man diese Suchpfade durch Einträge im <probing>-Tag erweitern. Alle dort aufgelisteten Pfade müssen unterhalb des Applikationsbasisverzeichnisses liegen.
Im Beispiel geben wir zusätzlich das Unterverzeichnis bin an.

TestLoading.exe.config
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin"/>
    </assemblyBinding>
  </runtime>
</configuration>

Da die Assemblydatei MyAssembly.dll nicht vorhanden ist (siehe Beispiel "Einfaches Probing"), können wir aus der Fehlermeldung wieder die beim Probing abgesuchten URIs sehen.



Beispiel "Probing mit Sprachmerkmal"

Nun gibt es auch noch die Möglichkeit einem Assembly ein sogenanntes Sprachmerkmal zuzuweisen.
Im Beispiel wollen wir eine österreichische Version unseres MyAssembly erzeugen. Wir erreichen dies durch Verwendung des Attributs System.Reflection.AssemblyCultureAttribute, das wir auf de-AT setzen.

MyAssemblyAT.cs
using System.Reflection;

[assembly:AssemblyCulture("de-AT")]

public class MyAssembly {
  public static void SayHello () {
    System.Console.WriteLine("Hallo Oesterreich!");
  }
}

Wir müssen nun auch das Assembly TestLoading neu erzeugen, um die zuvor generierte österreichische Version von MyAssembly zu referenzieren. (Die Compiler-Warnung können wir für dieses Beispiel ruhigen Gewissens ignorieren. Sie weist darauf hin, dass man Assemblies mit Sprachmerkmal eigentlich nicht direkt referenzieren (Compiler-Option /r), sondern nur über Konfigurationsdateien mit einer Applikation verknüpfen sollte.)



Assemblies mit einen bestimmten Sprachmerkmal werden auch bei Probing an anderen Orten gesucht, als Culture=neutral-Assemblies. In den Probing-URIs ist immer auch ein Verzeichnis, dessen Name dem Sprachmerkmal entspricht, zu finden.