So sucht Common Language Runtime nach AssemblysHow the Runtime Locates Assemblies

Um Ihre .NET Framework-Anwendung erfolgreich bereitstellen zu können, müssen Sie mit dem Verfahren vertraut sein, mit dem die Common Language Runtime die Assemblys sucht und bindet, aus denen Ihre Anwendung zusammengesetzt ist.To successfully deploy your .NET Framework application, you must understand how the common language runtime locates and binds to the assemblies that make up your application. Standardmäßig versucht die Common Language Runtime, die genaue Version einer Assembly einzubinden, mit der die Anwendung erstellt wurde.By default, the runtime attempts to bind with the exact version of an assembly that the application was built with. Dieses Standardverhalten kann durch Einstellungen in der Konfigurationsdatei überschrieben werden.This default behavior can be overridden by configuration file settings.

Die Common Language Runtime führt eine Reihe von Schritten aus, um eine Assembly zu finden und einen Assemblyverweis aufzulösen.The common language runtime performs a number of steps when attempting to locate an assembly and resolve an assembly reference. Die einzelnen Schritte werden in den folgenden Abschnitten erläutert.Each step is explained in the following sections. Der Begriff "Überprüfung" wird häufig verwendet, um zu beschreiben, wie die Common Language Runtime nach Assemblys sucht. Er bezieht sich auf die Heuristiken, mit denen die Assembly auf Basis ihres Namens und ihrer Kultur gesucht wird.The term probing is often used when describing how the runtime locates assemblies; it refers to the set of heuristics used to locate the assembly based on its name and culture.

Hinweis

Bindungsinformationen in der Protokolldatei können mit dem Assembly Binding Log Viewer („Fuslogvw.exe“)angezeigt werden, der im Windows SDK enthalten ist.You can view binding information in the log file using the Assembly Binding Log Viewer (Fuslogvw.exe), which is included in the Windows SDK.

Initiieren der BindungInitiating the Bind

Das Auffinden einer und Binden an eine Assembly beginnt mit dem Versuch der Common Language Runtime, einen Verweis auf eine andere Assembly aufzulösen.The process of locating and binding to an assembly begins when the runtime attempts to resolve a reference to another assembly. Dieser Verweis kann statisch oder dynamisch sein.This reference can be either static or dynamic. Der Compiler zeichnet statische Verweise in den Metadaten des Assemblymanifests während der Erstellungszeit auf.The compiler records static references in the assembly manifest's metadata at build time. Dynamische Verweise werden dynamisch erstellt und resultieren aus dem Aufruf verschiedener Methoden, z. B. Assembly.Load.Dynamic references are constructed on the fly as a result of calling various methods, such as Assembly.Load.

Die bevorzugte Methode zum Verweisen auf eine Assembly ist die Verwendung eines vollständigen Verweises mit Assemblynamen, -version, -kultur und Token des öffentlichen Schlüssels (falls vorhanden).The preferred way to reference an assembly is to use a full reference, including the assembly name, version, culture, and public key token (if one exists). Diese Informationen werden von der Common Language Runtime bei der Suche nach der Assembly verwendet. Die dabei ausgeführten Schritte werden in diesem Abschnitt weiter unten beschrieben.The runtime uses this information to locate the assembly, following the steps described later in this section. Der von der Common Language Runtime verwendete Auflösungsprozess ist immer gleich, unabhängig davon, ob sich der Verweis auf eine statische oder dynamische Assembly bezieht.The runtime uses the same resolution process regardless of whether the reference is for a static or dynamic assembly.

Sie können auch dynamisch auf eine Assembly verweisen, indem Sie die aufrufende Methode nur unter Angabe partieller Informationen zur Assembly, z. B. des Assemblynamens, bereitstellen.You can also make a dynamic reference to an assembly by providing the calling method with only partial information about the assembly, such as specifying only the assembly name. In diesem Fall wird lediglich das Anwendungsverzeichnis nach der Assembly durchsucht; es erfolgen keine weiteren Überprüfungen.In this case, only the application directory is searched for the assembly, and no other checking occurs. Einen partiellen Verweis können Sie mit jeder der verschiedenen Methoden zum Laden von Assemblys erstellen, z. B. mit Assembly.Load oder AppDomain.Load.You make a partial reference using any of the various methods for loading assemblies such as Assembly.Load or AppDomain.Load.

Mit einer Methode wie Assembly.Load können Sie auch einen dynamischen Verweis erstellen und nur partielle Informationen angeben. Dann qualifizieren Sie den Verweis mithilfe des <qualifyAssembly>-Elements in der Anwendungskonfigurationsdatei.Finally, you can make a dynamic reference using a method such as Assembly.Load and provide only partial information; you then qualify the reference using the <qualifyAssembly> element in the application configuration file. Mit diesem Element können Sie die vollständigen Verweisinformationen (Name, Version, Kultur und ggf. das Token des öffentlichen Schlüssels) in der Anwendungskonfigurationsdatei statt im Code bereitstellen.This element allows you to provide the full reference information (name, version, culture and, if applicable, the public key token) in your application configuration file instead of in your code. Dieses Verfahren sollten Sie anwenden, wenn Sie einen Verweis auf eine Assembly außerhalb des Anwendungsverzeichnisses vollständig qualifizieren oder auf eine Assembly im globalen Assemblycache verweisen möchten, aber gleichzeitig aus praktischen Gründen den vollständigen Verweis in der Konfigurationsdatei statt im Code angeben möchten.You would use this technique if you wanted to fully qualify a reference to an assembly outside the application directory, or if you wanted to reference an assembly in the global assembly cache but you wanted the convenience of specifying the full reference in the configuration file instead of in your code.

Hinweis

Diesen Typ des partiellen Verweises sollten Sie nicht bei Assemblys verwenden, die für mehrere Anwendungen freigegeben sind.This type of partial reference should not be used with assemblies that are shared among several applications. Da Konfigurationseinstellungen nach Anwendung und nicht nach Assembly erfolgen, müssten bei einer freigegebenen Assembly mit diesem Typ des partiellen Verweises für jede Anwendung, die diese freigegebene Assembly verwendet, die qualifizierenden Informationen in der jeweiligen Konfigurationsdatei enthalten sein.Because configuration settings are applied per application and not per assembly, a shared assembly using this type of partial reference would require each application using the shared assembly to have the qualifying information in its configuration file.

Die Common Language Runtime verwendet die folgenden Schritte, um einen Assemblyverweis aufzulösen:The runtime uses the following steps to resolve an assembly reference:

  1. Bestimmen der korrekten Assemblyversion durch Überprüfung anwendbarer Konfigurationsdateien, einschließlich der Anwendungskonfigurationsdatei, der Herausgeberrichtliniendatei und der Computerkonfigurationsdatei.Determines the correct assembly version by examining applicable configuration files, including the application configuration file, publisher policy file, and machine configuration file. Wenn die Konfigurationsdatei auf einem Remotecomputer gespeichert ist, muss die Common Language Runtime zuerst die Anwendungskonfigurationsdatei suchen und herunterladen.If the configuration file is located on a remote machine, the runtime must locate and download the application configuration file first.

  2. Überprüfen, ob der Assemblyname bereits zuvor gebunden wurde . Ist dies der Fall, wird die zuvor geladene Assembly verwendet.Checks whether the assembly name has been bound to before and, if so, uses the previously loaded assembly. Wenn eine vorherige Anforderung zum Laden der Assembly nicht ausgeführt werden konnte, führt die Anforderung sofort zu einem Fehler, ohne dass versucht wird, die Assembly zu laden.If a previous request to load the assembly failed, the request is failed immediately without attempting to load the assembly.

    Hinweis

    Das Caching von Assemblybindungsfehlern ist neu in .NET Framework Version 2.0.The caching of assembly binding failures is new in the .NET Framework version 2.0.

  3. Durchsuchen des globalen Assemblycache.Checks the global assembly cache. Wird die Assembly dort gefunden, wird sie von der Common Language Runtime verwendet.If the assembly is found there, the runtime uses this assembly.

  4. Suchen der Assembly , wobei folgendermaßen vorgegangen wird:Probes for the assembly using the following steps:

    1. Wenn die Konfiguration und die Herausgeberrichtlinie keine Auswirkung auf den ursprünglichen Verweis haben und die Anforderung zur Bindung mithilfe der Assembly.LoadFrom -Methode erstellt wurde, sucht die Common Language Runtime nach Hinweisen auf den Speicherort.If configuration and publisher policy do not affect the original reference and if the bind request was created using the Assembly.LoadFrom method, the runtime checks for location hints.

    2. Wenn eine CodeBase in den Konfigurationsdateien gefunden wurde, wird nur dieser Speicherort überprüft.If a codebase is found in the configuration files, the runtime checks only this location. Wenn die Überprüfung fehlschlägt, wird durch die Common Language Runtime festgelegt, dass die Anforderung zur Bindung fehlgeschlagen ist und keine weitere Überprüfung erfolgt.If this probe fails, the runtime determines that the binding request failed and no other probing occurs.

    3. Überprüfen der Assembly mithilfe von Heuristiken, die im Abschnitt Überprüfungbeschrieben sind.Probes for the assembly using the heuristics described in the probing section. Wurde die Assembly nach der Überprüfung nicht gefunden, fordert die Common Language Runtime Windows Installer auf, die Assembly zur Verfügung zu stellen.If the assembly is not found after probing, the runtime requests the Windows Installer to provide the assembly. Dabei handelt es sich um eine Installation bei Bedarf.This acts as an install-on-demand feature.

      Hinweis

      Es findet weder eine Versionsüberprüfung von Assemblys ohne starken Namen statt, noch überprüft die Common Language Runtime den globalen Assemblycache nach Assemblys ohne starken Namen.There is no version checking for assemblies without strong names, nor does the runtime check in the global assembly cache for assemblies without strong names.

Schritt 1: Untersuchen der KonfigurationsdateienStep 1: Examining the Configuration Files

Das Assemblybindungsverhalten kann auf verschiedenen Ebenen auf Basis von drei XML-Dateien konfiguriert werden:Assembly binding behavior can be configured at different levels based on three XML files:

  • AnwendungskonfigurationsdateiApplication configuration file.

  • HerausgeberrichtliniendateiPublisher policy file.

  • ComputerkonfigurationsdateiMachine configuration file.

Diese Dateien verwenden dieselbe Syntax und stellen Informationen wie Bindungsumleitungen, den Speicherort des Codes und Bindungsarten für bestimmte Assemblys zur Verfügung.These files follow the same syntax and provide information such as binding redirects, the location of code, and binding modes for particular assemblies. Jede Konfigurationsdatei kann ein <assemblyBinding>-Element enthalten, das den Bindungsprozess umleitet.Each configuration file can contain an <assemblyBinding> element that redirects the binding process. Die untergeordneten Elemente des <assemblyBinding>-Elements enthalten das <dependentAssembly>-Element.The child elements of the <assemblyBinding> element include the <dependentAssembly> element. Die untergeordneten Elemente des <dependentAssembly>-Elements schließen das <assemblyIdentity>-Element, das <bindingRedirect>-Element und das <codeBase>-Element ein.The children of <dependentAssembly> element include the <assemblyIdentity> element, the <bindingRedirect> element, and the <codeBase> element.

Hinweis

Konfigurationsinformationen sind in den drei Konfigurationsdateien enthalten. Nicht alle Elemente sind auch in allen Konfigurationsdateien gültig.Configuration information can be found in the three configuration files; not all elements are valid in all configuration files. So können sich z. B. Informationen zum Bindungsmodus und privaten Pfad nur in der Anwendungskonfigurationsdatei befinden.For example, binding mode and private path information can only be in the application configuration file. Eine vollständige Liste der Informationen, die in jeder Datei enthalten sind, finden Sie unter Konfigurieren von Apps mithilfe von Konfigurationsdateien.For a complete list of the information that is contained in each file, see Configuring Apps by Using Configuration Files.

AnwendungskonfigurationsdateiApplication Configuration File

Im ersten Schritt durchsucht die Common Language Runtime die Anwendungskonfigurationsdatei nach Informationen, die die im Manifest der aufrufenden Assembly gespeicherten Versionsinformationen überschreiben.First, the common language runtime checks the application configuration file for information that overrides the version information stored in the calling assembly's manifest. Die Anwendungskonfigurationsdatei kann mit einer Anwendung bereitgestellt werden, wird aber nicht für die Ausführung der Anwendung benötigt.The application configuration file can be deployed with an application, but is not required for application execution. In der Regel erfolgt der Abruf dieser Datei fast unmittelbar, aber in Fällen, in denen sich die Anwendungsbasis auf einem Remotecomputer befindet, wie z. B. in einem webbasierten Szenario mit Internet Explorer, muss die Konfigurationsdatei heruntergeladen werden.Usually the retrieval of this file is almost instantaneous, but in situations where the application base is on a remote computer, such as in an Internet Explorer Web-based scenario, the configuration file must be downloaded.

Im Fall von ausführbaren Clientdateien befindet sich die Anwendungskonfigurationsdatei im selben Verzeichnis wie die ausführbare Datei der Anwendung und verfügt über denselben Basisnamen wie diese sowie über die Dateierweiterung ".config".For client executables, the application configuration file resides in the same directory as the application's executable and has the same base name as the executable with a .config extension. Die Konfigurationsdatei für "C:\Programme\Myapp\Myapp.exe" ist beispielsweise "C:\Programme\Myapp\Myapp.exe.config". In einem browserbasierten Szenario muss die HTML-Datei das <link> -Element verwenden, um explizit auf die Konfigurationsdatei zu verweisen.For example, the configuration file for C:\Program Files\Myapp\Myapp.exe is C:\Program Files\Myapp\Myapp.exe.config. In a browser-based scenario, the HTML file must use the <link> element to explicitly point to the configuration file.

Der folgende Code bietet ein einfaches Beispiel für eine Anwendungskonfigurationsdatei.The following code provides a simple example of an application configuration file. In diesem Beispiel wird der TextWriterTraceListener -Auflistung ein Listeners hinzugefügt, um das Aufzeichnen von Debuginformationen in einer Datei zu aktivieren.This example adds a TextWriterTraceListener to the Listeners collection to enable recording debug information to a file.

<configuration>
   <system.diagnostics>
      <trace useGlobalLock="false" autoflush="true" indentsize="0">
         <listeners>
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />
         </listeners>
      </trace>
   </system.diagnostics>
</configuration>

HerausgeberrichtliniendateiPublisher Policy File

Im zweiten Schritt überprüft die Common Language Runtime die Herausgeberrichtliniendatei, sofern eine solche vorhanden ist.Second, the runtime examines the publisher policy file, if one exists. Herausgeberrichtliniendateien werden von einem Komponentenherausgeber als Fix oder Update an eine freigegebene Komponente verteilt.Publisher policy files are distributed by a component publisher as a fix or update to a shared component. Diese Dateien enthalten Informationen zur Kompatibilität, die vom Herausgeber der freigegebenen Komponente ausgegeben werden. Diese Komponente leitet einen Assemblyverweis an eine neue Version weiter.These files contain compatibility information issued by the publisher of the shared component that directs an assembly reference to a new version. Anders als Anwendungs- und Computerkonfigurationsdateien sind Herausgeberrichtliniendateien in ihren eigenen Assemblys enthalten, die im globalen Assemblycache installiert sein müssen.Unlike application and machine configuration files, publisher policy files are contained in their own assembly that must be installed in the global assembly cache.

Es folgt ein Beispiel einer Konfigurationsdatei für Herausgeberrichtlinien:The following is an example of a Publisher Policy configuration file:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

            <dependentAssembly>
                <assemblyIdentity name="asm6" publicKeyToken="c0305c36380ba429" />
                <bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0"/>
            </dependentAssembly>

        </assemblyBinding>
    </runtime>
</configuration>

Zum Erstellen einer Assembly können Sie das Al.exe (Assembly Linker)-Tool mit einem Befehl wie dem Folgenden verwenden:To create an assembly, you can use the Al.exe (Assembly Linker) tool with a command such as the following:

Al.exe /link:asm6.exe.config /out:policy.3.0.asm6.dll /keyfile: compatkey.dat /v:3.0.0.0

compatkey.dat ist eine Schlüsseldatei mit starkem Namen.compatkey.dat is a strong-name key file. Dieser Befehl erstellt eine Assembly mit starkem Namen, die Sie im globalen Assemblycache einfügen können.This command creates a strong-named assembly you can place in the global assembly cache.

Hinweis

Herausgeberrichtlinien haben Auswirkungen auf alle Anwendungen, die eine freigegebene Komponente verwenden.Publisher policy affects all applications that use a shared component.

Die Konfigurationsdatei für Herausgeberrichtlinien überschreibt Versionsinformationen, die aus der Anwendung stammen (d. h. aus dem Assemblymanifest oder aus der Anwendungskonfigurationsdatei).The publisher policy configuration file overrides version information that comes from the application (that is, from the assembly manifest or from the application configuration file). Wenn in der Anwendungskonfigurationsdatei keine Anweisung zur Umleitung der im Assemblymanifest angegebenen Version enthalten ist, überschreibt die Herausgeberrichtliniendatei die Version, die im Assemblymanifest angeben ist.If there is no statement in the application configuration file to redirect the version specified in the assembly manifest, the publisher policy file overrides the version specified in the assembly manifest. Enthält die Anwendungskonfigurationsdatei hingegen eine Umleitungsanweisung, überschreibt die Herausgeberrichtlinie die dort angegebene Version und nicht diejenige, die im Manifest angegeben ist.However, if there is a redirecting statement in the application configuration file, publisher policy overrides that version rather than the one specified in the manifest.

Eine Herausgeberrichtliniendatei wird verwendet, wenn eine freigegebene Komponente aktualisiert wird und die neue Version der freigegebenen Komponente von allen Anwendungen übernommen werden soll, die diese Komponente verwenden.A publisher policy file is used when a shared component is updated and the new version of the shared component should be picked up by all applications using that component. Die Einstellungen in der Herausgeberrichtliniendatei überschreiben diejenigen der Anwendungskonfigurationsdatei, es sei denn, diese erzwingt den abgesicherten Modus.The settings in the publisher policy file override settings in the application configuration file, unless the application configuration file enforces safe mode.

Abgesicherter ModusSafe Mode

Herausgeberrichtliniendateien werden in der Regel explizit als Teil eines Service Packs oder eines Programmupdates installiert.Publisher policy files are usually explicitly installed as part of a service pack or program update. Wenn Probleme mit der aktualisierten freigegebenen Komponente auftreten sollten, können Sie die Überschreibungen in der Herausgeberrichtliniendatei ignorieren und den abgesicherten Modus verwenden.If there is any problem with the upgraded shared component, you can ignore the overrides in the publisher policy file using safe mode. Der abgesicherte Modus wird vom Element <publisherPolicy apply="yes|no"/> bestimmt, das sich nur in der Anwendungskonfigurationsdatei befindet.Safe mode is determined by the <publisherPolicy apply="yes|no"/> element, located only in the application configuration file. Es legt fest, ob die Informationen zur Herausgeberrichtlinienkonfiguration aus dem Bindungsprozess entfernt werden sollten.It specifies whether the publisher policy configuration information should be removed from the binding process.

Der abgesicherte Modus kann auf die gesamte Anwendung oder ausgewählte Assemblys angewendet werden.Safe mode can be set for the entire application or for selected assemblies. Das heißt, Sie können die Richtlinie für alle Assemblys aufheben, aus denen die Anwendung zusammengesetzt ist, oder für einige ausgewählte Assemblys aktivieren.That is, you can turn off the policy for all assemblies that make up the application, or turn it on for some assemblies but not others. Um die Herausgeberrichtlinie selektiv auf Assemblys anzuwenden, aus denen sich eine Anwendung zusammensetzt, legen Sie <publisherPolicy apply=no/> fest und bestimmen die Assemblys, die davon betroffen sein sollen, mit dem <dependentAssembly>-Element.To selectively apply publisher policy to assemblies that make up an application, set <publisherPolicy apply=no/> and specify which assemblies you want to be affected using the <dependentAssembly> element. Um die Herausgeberrichtlinie auf alle Assemblys anzuwenden, legen Sie <publisherPolicy apply=no/> ohne abhängige Assemblyelemente fest.To apply publisher policy to all assemblies that make up the application, set <publisherPolicy apply=no/> with no dependent assembly elements. Weitere Informationen zur Konfiguration finden Sie unter Konfigurieren von Apps mithilfe von Konfigurationsdateien.For more about configuration, see Configuring Apps by using Configuration Files.

ComputerkonfigurationsdateiMachine Configuration File

Im dritten Schritt überprüft die Common Language Runtime die Computerkonfigurationsdatei.Third, the runtime examines the machine configuration file. Diese Datei mit dem Namen "Machine.config" befindet sich auf dem lokalen Computer im Unterverzeichnis "Config" des Stammverzeichnisses, in dem die Common Language Runtime installiert ist.This file, called Machine.config, resides on the local computer in the Config subdirectory of the root directory where the runtime is installed. Diese Datei kann von Administratoren verwendet werden, um lokale Assemblybindungsbeschränkungen für diesen Computer festzulegen.This file can be used by administrators to specify assembly binding restrictions that are local to that computer. Die Einstellungen in der Computerkonfigurationsdatei haben Vorrang vor allen anderen Konfigurationseinstellungen. Dies bedeutet allerdings nicht, dass sich alle Konfigurationseinstellungen in dieser Datei befinden sollten.The settings in the machine configuration file take precedence over all other configuration settings; however, this does not mean that all configuration settings should be put in this file. Die Version, die in der Administratorrichtliniendatei festgelegt ist, ist endgültig und kann nicht überschrieben werden.The version determined by the administrator policy file is final, and cannot be overridden. Überschreibungen, die in der Datei "Machine.config" festgelegt sind, haben Auswirkungen auf alle Anwendungen.Overrides specified in the Machine.config file affect all applications. Weitere Informationen zu Konfigurationsdateien finden Sie unter Konfigurieren von Apps mithilfe von Konfigurationsdateien.For more information about configuration files, see Configuring Apps by using Configuration Files.

Schritt 2: Suchen nach Assemblys, auf die zuvor verwiesen wurdeStep 2: Checking for Previously Referenced Assemblies

Wenn die angeforderte Assembly bereits in vorherigen Aufrufen angefordert wurde, verwendet die Common Language Runtime die Assembly, die bereits geladen ist.If the requested assembly has also been requested in previous calls, the common language runtime uses the assembly that is already loaded. Dies kann sich auf die Namensgebung für Assemblys auswirken, aus denen eine Anwendung zusammengesetzt ist.This can have ramifications when naming assemblies that make up an application. Weitere Informationen zum Benennen von Assemblys finden Sie unter Assemblynamen.For more information about naming assemblies, see Assembly Names.

Wenn eine vorherige Anforderung für die Assembly nicht ausgeführt werden konnte, führen weitere Anforderungen sofort zu einem Fehler, ohne dass versucht wird, die Assembly zu laden.If a previous request for the assembly failed, subsequent requests for the assembly are failed immediately without attempting to load the assembly. Ab .NET Framework Version 2.0 werden Assemblybindungsfehler zwischengespeichert. Anhand der zwischengespeicherten Informationen wird bestimmt, ob versucht wird, die Assembly zu laden.Starting with the .NET Framework version 2.0, assembly binding failures are cached, and the cached information is used to determine whether to attempt to load the assembly.

Hinweis

Um zu dem Verhalten der .NET Framework-Versionen 1.0 und 1.1 zurückzukehren, in denen Bindungsfehler nicht zwischengespeichert wurden, nehmen Sie das <disableCachingBindingFailures>-Element in Ihre Konfigurationsdatei auf.To revert to the behavior of the .NET Framework versions 1.0 and 1.1, which did not cache binding failures, include the <disableCachingBindingFailures> Element in your configuration file.

Schritt 3: Durchsuchen des globalen AssemblycacheStep 3: Checking the Global Assembly Cache

Für Assemblys mit starkem Namen wird der Bindungsprozess durch die Überprüfung des globalen Assemblycache fortgesetzt.For strong-named assemblies, the binding process continues by looking in the global assembly cache. Im globalen Assemblycache werden Assemblys gespeichert, die von mehreren Anwendungen auf einem Computer verwendet werden können.The global assembly cache stores assemblies that can be used by several applications on a computer. Alle Assemblys im globalen Assemblycache müssen einen starken Namen aufweisen.All assemblies in the global assembly cache must have strong names.

Schritt 4: Suchen der Assembly mit CodeBases oder durch ÜberprüfungStep 4: Locating the Assembly through Codebases or Probing

Nachdem die richtige Assemblyversion mithilfe der Informationen aus dem Verweis der aufrufenden Assembly und den Konfigurationsdateien ermittelt worden ist und der globale Assemblycache (nur nach Assemblys mit starkem Namen) überprüft wurde, versucht die Common Language Runtime, die Assembly ausfindig zu machen.After the correct assembly version has been determined by using the information in the calling assembly's reference and in the configuration files, and after it has checked in the global assembly cache (only for strong-named assemblies), the common language runtime attempts to find the assembly. Die Suche nach einer Assembly setzt sich aus folgenden Schritten zusammen:The process of locating an assembly involves the following steps:

  1. Wird ein <codeBase>-Element in der Anwendungskonfigurationsdatei gefunden, überprüft die Common Language Runtime den angegebenen Speicherort.If a <codeBase> element is found in the application configuration file, the runtime checks the specified location. Wenn eine Übereinstimmung gefunden wird, wird diese Assembly verwendet und es findet keine Überprüfung statt.If a match is found, that assembly is used and no probing occurs. Wird die Assembly dort nicht gefunden, schlägt die Bindungsanforderung fehl.If the assembly is not found there, the binding request fails.

  2. Die Common Language Runtime sucht daraufhin nach der Assembly, auf die verwiesen wurde, und wendet dabei die Regeln an, die weiter unten im Abschnitt erläutert sind.The runtime then probes for the referenced assembly using the rules specified later in this section.

Hinweis

Wenn mehrere Versionen einer Assembly in einem Verzeichnis vorhanden sind und Sie auf eine bestimmte Version dieser Assembly verweisen möchten, müssen Sie das <codeBase>-Element anstelle des privatePath-Attributs des <probing>-Elements verwenden.If you have multiple versions of an assembly in a directory and you want to reference a particular version of that assembly, you must use the <codeBase> element instead of the privatePath attribute of the <probing> element. Bei Verwendung des <probing>-Elements beendet die Common Language Runtime die Überprüfung beim ersten Auffinden einer Assembly mit dem einfachen Assemblynamen, auf den verwiesen wird, ganz gleich, ob es sich um eine korrekte Übereinstimmung handelt oder nicht.If you use the <probing> element, the runtime stops probing the first time it finds an assembly that matches the simple assembly name referenced, whether it is a correct match or not. Bei einer korrekten Übereinstimmung wird diese Assembly verwendet.If it is a correct match, that assembly is used. Wenn es sich nicht um eine korrekte Übereinstimmung handelt, wird die Überprüfung beendet und die Bindung schlägt fehl.If it is not a correct match, probing stops and binding fails.

Assemblysuche mit CodeBasesLocating the Assembly through Codebases

CodeBase-Informationen können über ein <codeBase>-Element in einer Konfigurationsdatei zur Verfügung gestellt werden.Codebase information can be provided by using a <codeBase> element in a configuration file. Diese CodeBase wird stets überprüft, bevor die Common Language Runtime nach der Assembly sucht, auf die verwiesen wird.This codebase is always checked before the runtime attempts to probe for the referenced assembly. Enthält eine Herausgeberrichtliniendatei, in der die Umleitung der endgültigen Version enthalten ist, auch ein <codeBase>-Element, wird dieses <codeBase>-Element verwendet.If a publisher policy file containing the final version redirect also contains a <codeBase> element, that <codeBase> element is the one that is used. Wenn beispielsweise Ihre Anwendungskonfigurationsdatei ein <codeBase>-Element festlegt, gleichzeitig aber eine Herausgeberrichtliniendatei, die Anwendungsinformationen überschreibt, ebenfalls ein <codeBase>-Element festlegt, wird das <codeBase>-Element in der Herausgeberrichtliniendatei verwendet.For example, if your application configuration file specifies a <codeBase> element, and a publisher policy file that is overriding the application information also specifies a <codeBase> element, the <codeBase> element in the publisher policy file is used.

Wenn am Speicherort, der durch das <codeBase>-Element angegeben ist, keine Übereinstimmung gefunden wird, schlägt die Bindungsanforderung fehl und es werden keine weiteren Schritte ausgeführt.If no match is found at the location specified by the <codeBase> element, the bind request fails and no further steps are taken. Wird durch die Common Language Runtime ermittelt, dass eine Assembly den Kriterien der aufrufenden Assembly entspricht, wird diese Assembly verwendet.If the runtime determines that an assembly matches the calling assembly's criteria, it uses that assembly. Wenn die durch das angegebene <codeBase>-Element festgelegte Datei geladen wird, überprüft die Common Language Runtime, ob Name, Version, Kultur und öffentlicher Schlüssel dem Verweis der aufrufenden Assembly entsprechen.When the file specified by the given <codeBase> element is loaded, the runtime checks to make sure that the name, version, culture, and public key match the calling assembly's reference.

Hinweis

Assemblys, auf die verwiesen wird und die sich außerhalb des Stammverzeichnisses der Anwendung befinden, müssen einen starken Namen aufweisen und entweder im globalen Assemblycache installiert sein oder mithilfe des <codeBase>-Elements angegeben werden.Referenced assemblies outside the application's root directory must have strong names and must either be installed in the global assembly cache or specified using the <codeBase> element.

Assemblysuche durch ÜberprüfungLocating the Assembly through Probing

Wenn sich kein <codeBase>-Element in der Anwendungskonfigurationsdatei befindet, führt die Common Language Runtime eine Überprüfung für die Assembly anhand von vier Kriterien durch:If there is no <codeBase> element in the application configuration file, the runtime probes for the assembly using four criteria:

  • Anwendungsbasis, die der Stammort für die Ausführung der Anwendung ist.Application base, which is the root location where the application is being executed.

  • Kultur, die das Kulturattribut der Assembly darstellt, auf die verwiesen wird.Culture, which is the culture attribute of the assembly being referenced.

  • Name der Assembly, auf die verwiesen wird.Name, which is the name of the referenced assembly.

  • Das privatePath-Attribut des <probing>-Elements, bei dem es sich um die benutzerdefinierte Liste von Unterverzeichnissen unter dem Stammspeicherort handelt.The privatePath attribute of the <probing> element, which is the user-defined list of subdirectories under the root location. Dieser Speicherort kann in der Anwendungskonfigurationsdatei und in verwaltetem Code mithilfe der AppDomainSetup.PrivateBinPath-Eigenschaft für eine Anwendungsdomäne festgelegt werden.This location can be specified in the application configuration file and in managed code using the AppDomainSetup.PrivateBinPath property for an application domain. Im Fall der Festlegung in verwaltetem Code wird zuerst der privatePath des verwalteten Codes und daraufhin der in der Anwendungskonfigurationsdatei angegebene Pfad überprüft.When specified in managed code, the managed code privatePath is probed first, followed by the path specified in the application configuration file.

Überprüfen der Anwendungsbasis- und KulturverzeichnisseProbing the Application Base and Culture Directories

Die Common Language Runtime beginnt mit der Überprüfung immer in der Anwendungsbasis, die entweder eine URL oder das Stammverzeichnis der Anwendung auf einem Computer ist.The runtime always begins probing in the application's base, which can be either a URL or the application's root directory on a computer. Wird die Assembly, auf die verwiesen wird, in der Anwendungsbasis nicht gefunden und stehen keine Informationen zur Kultur bereit, durchsucht die Common Language Runtime alle Unterverzeichnisse mit diesem Assemblynamen.If the referenced assembly is not found in the application base and no culture information is provided, the runtime searches any subdirectories with the assembly name. Zu den überprüften Verzeichnissen gehören:The directories probed include:

  • [Anwendungsbasis] / [Assemblyname].dll[application base] / [assembly name].dll

  • [Anwendungsbasis] / [Assemblyname] / [Assemblyname].dll[application base] / [assembly name] / [assembly name].dll

Wenn für die Assembly, auf die verwiesen wird, Informationen zur Kultur angegeben sind, werden nur die folgenden Verzeichnisse überprüft:If culture information is specified for the referenced assembly, only the following directories are probed:

  • [Anwendungsbasis] / [Kultur] / [Assemblyname].dll[application base] / [culture] / [assembly name].dll

  • [Anwendungsbasis] / [Kultur] / [Assemblyname] / [Assemblyname].dll[application base] / [culture] / [assembly name] / [assembly name].dll

Überprüfen mit dem privatePath-AttributProbing with the privatePath Attribute

Zusätzlich zu den Unterverzeichnissen der Kultur und den Unterverzeichnissen mit dem Namen der Assembly, auf die verwiesen wird, überprüft die Common Language Runtime auch Verzeichnisse, die mit dem privatePath-Attribut des <probing>-Elements angegeben werden.In addition to the culture subdirectories and the subdirectories named for the referenced assembly, the runtime also probes directories specified using the privatePath attribute of the <probing> element. Die Verzeichnisse, die mit dem privatePath -Attribut angegeben werden, müssen Unterverzeichnisse des Stammverzeichnisses der Anwendung sein.The directories specified using the privatePath attribute must be subdirectories of the application's root directory. Die überprüften Verzeichnisse unterscheiden sich, je nachdem, ob Informationen zur Kultur in der Anforderung der Assembly enthalten sind, auf die verwiesen wird.The directories probed vary depending on whether culture information is included in the referenced assembly request.

Die Common Language Runtime beendet die Überprüfung beim ersten Auffinden einer Assembly mit dem einfachen Assemblynamen, auf den verwiesen wird, ganz gleich, ob es sich um eine korrekte Übereinstimmung handelt oder nicht.The runtime stops probing the first time it finds an assembly that matches the simple assembly name referenced, whether it is a correct match or not. Bei einer korrekten Übereinstimmung wird diese Assembly verwendet.If it is a correct match, that assembly is used. Wenn es sich nicht um eine korrekte Übereinstimmung handelt, wird die Überprüfung beendet und die Bindung schlägt fehl.If it is not a correct match, probing stops and binding fails.

Wenn Informationen zur Kultur enthalten sind, erfolgt die Überprüfung der folgenden Verzeichnisse:If culture is included, the following directories are probed:

  • [Anwendungsbasis] / [bin-Pfad] / [Kultur] / [Assemblyname].dll[application base] / [binpath] / [culture] / [assembly name].dll

  • [Anwendungsbasis] / [bin-Pfad] / [Kultur] / [Assemblyname] / [Assemblyname].dll[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll

Wenn keine Informationen zur Kultur enthalten sind, werden die folgenden Verzeichnisse überprüft:If culture information is not included, the following directories are probed:

  • [Anwendungsbasis] / [bin-Pfad] / [Assemblyname].dll[application base] / [binpath] / [assembly name].dll

  • [Anwendungsbasis] / [bin-Pfad] / [Assemblyname] / [Assemblyname].dll[application base] / [binpath] / [assembly name] / [assembly name].dll

Beispiele einer ÜberprüfungProbing Examples

Folgende Informationen stehen zur Verfügung:Given the following information:

  • Name der Assembly, auf die verwiesen wird: myAssemblyReferenced assembly name: myAssembly

  • Webanwendungs-Stammverzeichnis: http://www.code.microsoft.comApplication root directory: http://www.code.microsoft.com

  • <probing>-Element in der Konfigurationsdatei: bin<probing> element in configuration file specifies: bin

  • Kultur: deCulture: de

Die Common Language Runtime überprüft die folgenden URLs:The runtime probes the following URLs:

  • http://www.code.microsoft.com/de/myAssembly.dll

  • http://www.code.microsoft.com/de/myAssembly/myAssembly.dll

  • http://www.code.microsoft.com/bin/de/myAssembly.dll

  • http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll

Mehrere Assemblys mit dem gleichen NamenMultiple Assemblies with the Same Name

Das folgende Beispiel zeigt, wie mehrere Assemblys mit dem gleichen Namen konfiguriert werden.The following example shows how to configure multiple assemblies with the same name.

<dependentAssembly>
   <assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
   <codeBase version="1.0.0.0" href="v1/Server.dll" />
   <codeBase version="2.0.0.0" href="v2/Server.dll" />
</dependentAssembly>

Weitere überprüfte SpeicherorteOther Locations Probed

Der Speicherort einer Assembly kann auch mithilfe des aktuellen Bindungskontexts ermittelt werden.Assembly location can also be determined using the current binding context. Dieses Verfahren kommt besonders häufig bei Verwendung der Assembly.LoadFrom -Methode und in Szenarien mit COM-Interop zum Einsatz.This most often occurs when the Assembly.LoadFrom method is used and in COM interop scenarios. Wenn eine Assembly die LoadFrom -Methode verwendet, um auf eine andere Assembly zu verweisen, wird der Speicherort der aufrufenden Assembly als Hinweis auf den Speicherort der Assembly angesehen, auf die verwiesen wird.If an assembly uses the LoadFrom method to reference another assembly, the calling assembly's location is considered to be a hint about where to find the referenced assembly. Bei gefundener Übereinstimmung wird diese Assembly geladen.If a match is found, that assembly is loaded. Besteht keine Übereinstimmung, setzt die Common Language Runtime die Suche mit der entsprechenden Semantik fort und fordert Windows Installer auf, die Assembly zur Verfügung zu stellen.If no match is found, the runtime continues with its search semantics and then queries the Windows Installer to provide the assembly. Wenn keine Assembly zur Verfügung gestellt wird, die mit der Bindungsanforderung übereinstimmt, wird eine Ausnahme ausgelöst.If no assembly is provided that matches the binding request, an exception is thrown. Bei der Ausnahme handelt es sich um eine TypeLoadException in verwaltetem Code, sofern auf einen Typ verwiesen wurde, oder um eine FileNotFoundException , sofern die geladene Assembly nicht gefunden wurde.This exception is a TypeLoadException in managed code if a type was referenced, or a FileNotFoundException if an assembly being loaded was not found.

Wenn beispielsweise „Assembly1“ auf „Assembly2“ verweist und „Assembly1“ von http://www.code.microsoft.com/utils heruntergeladen wurde, wird dieser Speicherort als Hinweis auf den Speicherort von „Assembly2.dll“ angesehen.For example, if Assembly1 references Assembly2 and Assembly1 was downloaded from http://www.code.microsoft.com/utils, that location is considered to be a hint about where to find Assembly2.dll. Die Runtime sucht in http://www.code.microsoft.com/utils/Assembly2.dll und http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll nach der Assembly.The runtime then probes for the assembly in http://www.code.microsoft.com/utils/Assembly2.dll and http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. Wenn "Assembly2" in keinem der beiden Speicherorte vorhanden ist, wird eine Anfrage an Windows Installer gestellt.If Assembly2 is not found at either of those locations, the runtime queries the Windows Installer.

Siehe auchSee also