Best Practices für das Laden von AssemblysBest Practices for Assembly Loading

In diesem Artikel werden Möglichkeiten zur Vermeidung von Problemen mit der Typidentität erläutert, die zu InvalidCastException, MissingMethodException und anderen Fehlern führen können.This article discusses ways to avoid problems of type identity that can lead to InvalidCastException, MissingMethodException, and other errors. In diesem Artikel werden folgende Empfehlungen besprochen:The article discusses the following recommendations:

In der ersten Empfehlung, Vor- und Nachteile von Load-Kontexten, erhalten Sie Hintergrundinformationen zu den anderen Empfehlungen, da diese alle eine Kenntnis von Load-Kontexten voraussetzen.The first recommendation, understand the advantages and disadvantages of load contexts, provides background information for the other recommendations, because they all depend on a knowledge of load contexts.

Vor- und Nachteile von Load-KontextenUnderstand the Advantages and Disadvantages of Load Contexts

Assemblys können innerhalb einer Anwendungsdomäne in einen von drei Kontexten geladen werden. Alternativ können sie auch ohne Kontext geladen werden:Within an application domain, assemblies can be loaded into one of three contexts, or they can be loaded without context:

  • Der Standard-Load-Kontext enthält Assemblys, die beim Durchsuchen des globalen Assemblycaches, des Hostassemblyspeichers (wenn die Runtime gehostet wird, z.B. in SQL Server) und der Eigenschaften ApplicationBase und PrivateBinPath der Anwendungsdomäne gefunden wurden.The default load context contains assemblies found by probing the global assembly cache, the host assembly store if the runtime is hosted (for example, in SQL Server), and the ApplicationBase and PrivateBinPath of the application domain. Die meisten Überladungen der Methode Load laden Assemblys in diesen Kontext.Most overloads of the Load method load assemblies into this context.

  • Der LoadFrom-Kontext enthält Assemblys, die von Speicherorten geladen werden, die vom Ladeprogramm nicht durchsucht wurden.The load-from context contains assemblies that are loaded from locations that are not searched by the loader. Add-Ins können z.B. in einem Verzeichnis installiert sein, dass sich nicht im Anwendungspfad befindet.For example, add-ins might be installed in a directory that is not under the application path. Assembly.LoadFrom, AppDomain.CreateInstanceFrom und AppDomain.ExecuteAssembly sind Beispiel für Methoden, die anhand des Pfads laden.Assembly.LoadFrom, AppDomain.CreateInstanceFrom, and AppDomain.ExecuteAssembly are examples of methods that load by path.

  • Der ReflectionOnly-Kontext enthält Assemblys, die mit den Methoden ReflectionOnlyLoad und ReflectionOnlyLoadFrom geladen wurden.The reflection-only context contains assemblies loaded with the ReflectionOnlyLoad and ReflectionOnlyLoadFrom methods. Code, der sich in diesem Kontext befindet, kann nicht ausgeführt werden. Deshalb wird darauf hier nicht weiter eingegangen.Code in this context cannot be executed, so it is not discussed here. Weitere Informationen finden Sie unter How to: Load Assemblies into the Reflection-Only Context (Vorgehensweise: Laden von Assemblys in den ReflectionOnly-Kontext).For more information, see How to: Load Assemblies into the Reflection-Only Context.

  • Wenn Sie eine vorübergehende dynamische Assembly mit der Reflektionsausgabe erstellt haben, befindet die Assembly sich in keinem Kontext.If you generated a transient dynamic assembly by using reflection emit, the assembly is not in any context. Außerdem werden Assemblys, die mit der LoadFile-Methode geladen wurden, ohne Kontext geladen. Assemblys, die aus Bytearrays geladen werden, werden ohne Kontext geladen, es sei denn, ihre Identität (nachdem eine Richtlinie angewendet wurde) gibt an, dass sie sich im globalen Assemblycache befinden.In addition, most assemblies that are loaded by using the LoadFile method are loaded without context, and assemblies that are loaded from byte arrays are loaded without context unless their identity (after policy is applied) establishes that they are in the global assembly cache.

Der Ausführungskontexte haben Vor- und Nachteile, wie in den folgenden Abschnitten beschrieben.The execution contexts have advantages and disadvantages, as discussed in the following sections.

Standard-Load-KontextDefault Load Context

Wenn Assemblys in den Load-Kontext geladen werden, werden ihre Abhängigkeiten automatisch mitgeladen.When assemblies are loaded into the default load context, their dependencies are loaded automatically. Abhängigkeiten, die in den Standard-Load-Kontext geladen werden, werden automatisch für Assemblys im Standard-Load-Kontext oder dem LoadFrom-Kontext geladen.Dependencies that are loaded into the default load context are found automatically for assemblies in the default load context or the load-from context. Das Laden anhand der Assemblyidentität erhöht die Stabilität Ihrer Anwendung, da sichergestellt wird, dass unbekannte Assemblyversionen nicht verwendet werden (weitere Informationen im Abschnitt Vermeiden von Bindungen bei partiellen Assemblynamen).Loading by assembly identity increases the stability of applications by ensuring that unknown versions of assemblies are not used (see the Avoid Binding on Partial Assembly Names section).

Das Verwenden des Standard-Load-Kontexts hat folgende Nachteile:Using the default load context has the following disadvantages:

  • Abhängigkeiten, die in die andere Kontexte geladen werden, stehen nicht zur Verfügung.Dependencies that are loaded into other contexts are not available.

  • Sie können keine Assemblys von Speicherorten in den Standard-Load-Kontext laden, die sich außerhalb des Suchpfads befindet.You cannot load assemblies from locations outside the probing path into the default load context.

LoadFrom-KontextLoad-From Context

Im LoadFrom-Kontext können Sie eine Assembly aus einem Pfad laden, der sich nicht im Anwendungspfad befindet und deshalb bei der Suche nicht berücksichtigt wird.The load-from context lets you load an assembly from a path that is not under the application path, and therefore is not included in probing. So können Abhängigkeiten in diesem Pfad gefunden und geladen werden, da die Pfadinformationen vom Kontext verwaltet werden.It enables dependencies to be located and loaded from that path, because the path information is maintained by the context. Des Weiteren können Assemblys in diesem Kontext Abhängigkeiten verwenden, die in den Standard-Load-Kontext geladen wurden.In addition, assemblies in this context can use dependencies that are loaded into the default load context.

Das Laden von Assemblys mit der Assembly.LoadFrom-Methode oder einer der anderen Methoden, die anhand des Pfads laden, hat folgende Nachteile:Loading assemblies by using the Assembly.LoadFrom method, or one of the other methods that load by path, has the following disadvantages:

  • Wenn eine Assembly mit der gleichen Identität bereits geladen wurde, gibt LoadFrom die geladene Assembly zurück, auch wenn ein anderer Pfad angegeben wurde.If an assembly with the same identity is already loaded, LoadFrom returns the loaded assembly even if a different path was specified.

  • Wenn eine Assembly mit LoadFrom geladen wird und eine Assembly im Standard-Load-Kontext zu einem späteren Zeitpunkt versucht, dieselbe Assembly anhand des Anzeigenamens zu laden, schlägt der Ladeversuch fehl.If an assembly is loaded with LoadFrom, and later an assembly in the default load context tries to load the same assembly by display name, the load attempt fails. Dies kann auftreten, wenn eine Assembly deserialisiert ist.This can occur when an assembly is deserialized.

  • Wenn eine Assembly mit LoadFrom geladen wurde und der Suchpfad eine Assembly mit der gleichen Identität an einem anderen Speicherort enthält, kann eine InvalidCastException, MissingMethodException oder ein anderes unerwartetes Verhalten auftreten.If an assembly is loaded with LoadFrom, and the probing path includes an assembly with the same identity but in a different location, an InvalidCastException, MissingMethodException, or other unexpected behavior can occur.

  • LoadFrom fordert FileIOPermissionAccess.Read und FileIOPermissionAccess.PathDiscovery oder WebPermission im angegebenen Pfad.LoadFrom demands FileIOPermissionAccess.Read and FileIOPermissionAccess.PathDiscovery, or WebPermission, on the specified path.

  • Wenn für die Assembly ein natives Image vorhanden ist, wird sie nicht verwendet.If a native image exists for the assembly, it is not used.

  • Die Assembly kann nicht als domänenneutral geladen werden.The assembly cannot be loaded as domain-neutral.

  • In .NET Framework Version 1.0 und 1.1 wird die Richtlinie nicht angewendet.In the .NET Framework versions 1.0 and 1.1, policy is not applied.

Kein KontextNo Context

Das Laden ohne Kontext ist die einzige Möglichkeit für vorübergehende, durch die Reflektionsausgabe generierte Assemblys.Loading without context is the only option for transient assemblies that are generated with reflection emit. Das Laden ohne Kontext ist die einzige Möglichkeit, mehrere Assemblys mit der gleichen Identität in eine Anwendungsdomäne zu laden.Loading without context is the only way to load multiple assemblies that have the same identity into one application domain. Der Suchaufwand wird umgangen.The cost of probing is avoided.

Aus Bytearrays geladenen Assemblys werden ohne Kontext geladen, es sei denn, die Identität der Assembly, die festgelegt wird, wenn die Richtlinie angewendet wird, entspricht der Identität der Assembly im globalen Assemblycache. In einem derartigen Fall wird die Assembly aus dem globalen Assemblycache geladen.Assemblies that are loaded from byte arrays are loaded without context unless the identity of the assembly, which is established when policy is applied, matches the identity of an assembly in the global assembly cache; in that case, the assembly is loaded from the global assembly cache.

Das Laden ohne Kontext hat folgende Nachteile:Loading assemblies without context has the following disadvantages:

  • Es können keine anderen Assemblys an Assemblys gebunden werden, die ohne Kontext geladen wurden, es sei denn, sie behandeln das AppDomain.AssemblyResolve-Ereignis.Other assemblies cannot bind to assemblies that are loaded without context, unless you handle the AppDomain.AssemblyResolve event.

  • Abhängigkeiten werden nicht automatisch geladen.Dependencies are not loaded automatically. Sie können sie vorab ohne Kontext oder in den Standard-Load-Kontext laden. Zudem können Sie sie laden, indem Sie das AppDomain.AssemblyResolve-Ereignis behandeln.You can preload them without context, preload them into the default load context, or load them by handling the AppDomain.AssemblyResolve event.

  • Das Laden mehrerer Assemblys mit der gleichen Identität ohne Kontext kann zu Probleme mit der Typidentität führen. Diese ähneln den Problemen, die durch das Laden von Assemblys mit der gleichen Identität in mehreren Kontexten verursacht werden.Loading multiple assemblies with the same identity without context can cause type identity problems similar to those caused by loading assemblies with the same identity into multiple contexts. Weitere Informationen finden Sie unter Vermeiden des Ladens von Assemblys in mehrere Kontexte.See Avoid Loading an Assembly into Multiple Contexts.

  • Wenn für die Assembly ein natives Image vorhanden ist, wird sie nicht verwendet.If a native image exists for the assembly, it is not used.

  • Die Assembly kann nicht als domänenneutral geladen werden.The assembly cannot be loaded as domain-neutral.

  • In .NET Framework Version 1.0 und 1.1 wird die Richtlinie nicht angewendet.In the .NET Framework versions 1.0 and 1.1, policy is not applied.

Vermeiden von Bindungen bei partiellen AssemblynamenAvoid Binding on Partial Assembly Names

Die partielle Namensbindung tritt auf, wenn Sie beim Laden einer Assembly nur einen Teil des Assemblyanzeigenamens (FullName) angeben.Partial name binding occurs when you specify only part of the assembly display name (FullName) when you load an assembly. Unter Umständen rufen Sie z.B. die Assembly.Load-Methode nur mit dem einfachen Namen der Assembly auf und lassen dabei die Version, Kultur und das öffentliche Schlüsseltoken weg.For example, you might call the Assembly.Load method with only the simple name of the assembly, omitting the version, culture, and public key token. Möglicherweise rufen Sie auch die Assembly.LoadWithPartialName-Methode auf, die zunächst die Assembly.Load-Methode aufruft. Falls die Assembly nicht gefunden werden kann, durchsucht die Methode den globalen Assemblycache und lädt die letzte verfügbare Version der Assembly.Or you might call the Assembly.LoadWithPartialName method, which first calls the Assembly.Load method and, if that fails to locate the assembly, searches the global assembly cache and loads the latest available version of the assembly.

Die partielle Namensbindung kann zu vielen Problemen führen, u.a.:Partial name binding can cause many problems, including the following:

  • Die Assembly.LoadWithPartialName-Methode lädt möglicherweise eine andere Assembly mit dem gleichen einfachen Namen.The Assembly.LoadWithPartialName method might load a different assembly with the same simple name. Möglicherweise werden so zwei völlig verschiedene Assemblys von zwei Anwendungen im globalen Assemblycache installiert, beide mit dem einfachen Namen GraphicsLibrary.For example, two applications might install two completely different assemblies that both have the simple name GraphicsLibrary into the global assembly cache.

  • Die Assembly, die tatsächlich geladen wird, ist möglicherweise nicht abwärtskompatibel.The assembly that is actually loaded might not be backward-compatible. Wenn Sie z.B. die Version nicht angeben, kann dies dazu führen, dass eine deutlich spätere Version als die Version geladen wird, für die Ihr Programm eigentlich geschrieben wurde.For example, not specifying the version might result in the loading of a much later version than the version your program was originally written to use. Änderungen in der späteren Version verursachen möglicherweise Fehler in Ihrer Anwendung.Changes in the later version might cause errors in your application.

  • Die Assembly, die tatsächlich geladen wird, ist möglicherweise nicht aufwärtskompatibel.The assembly that is actually loaded might not be forward-compatible. Ihre Anwendung kann z.B. mit der aktuellsten Version der Assembly entwickelt und geprüft worden sein, aber die partielle Bindung lädt möglicherweise eine sehr viel frühere Version, die nicht über die Funktionen verfügt,die Ihre Anwendung verwendet.For example, you might have built and tested your application with the latest version of an assembly, but partial binding might load a much earlier version that lacks features your application uses.

  • Das Installieren einer neuen Anwendung kann bereits vorhandene Anwendungen unterbrechen.Installing new applications can break existing applications. Eine Anwendung, die die LoadWithPartialName-Methode verwendet, kann durch die Installation einer neueren, inkompatiblen Version einer freigegebenen Assembly unterbrochen werden.An application that uses the LoadWithPartialName method can be broken by installing a newer, incompatible version of a shared assembly.

  • Das unvorhergesehene Laden von Abhängigkeiten kann auftreten.Unexpected dependency loading can occur. Wenn Sie zwei Assemblys mit einer gemeinsamen Abhängigkeit laden, kann das Laden mit partieller Bindung dazu führen, dass eine Assembly eine Komponente verwendet, für die sie nicht entwickelt bzw. geprüft wurde.It you load two assemblies that share a dependency, loading them with partial binding might result in one assembly using a component that it was not built or tested with.

Aufgrund der Probleme, die sie verursachen kann, wurde die LoadWithPartialName-Methode als veraltet markiert.Because of the problems it can cause, the LoadWithPartialName method has been marked obsolete. Es wird empfohlen, dass Sie stattdessen die Assembly.Load-Methode verwenden, und dass Sie vollständige Assemblyanzeigenamen angeben.We recommend that you use the Assembly.Load method instead, and specify full assembly display names. Weitere Informationen finden Sie unter Vor- und Nachteile von Load-Kontexten und Ziehen Sie in Erwägung, zum Standard-Load-Kontext zu wechseln.See Understand the Advantages and Disadvantages of Load Contexts and Consider Switching to the Default Load Context.

Wenn Sie die LoadWithPartialName-Methode verwenden möchten, weil es das Laden von Assemblys erleichtert, beachten Sie, dass, wenn Sie Ihre Anwendung mit einer Fehlermeldung fehlschlagen lassen, die die fehlende Assembly identifiziert, dies sehr wahrscheinlich zu einer besseren Benutzererfahrung führt als wenn Sie automatisch eine unbekannte Version der Assembly verwenden. Dies kann zu unvorhergesehenem Verhalten und Sicherheitslücken führen.If you want to use the LoadWithPartialName method because it makes assembly loading easy, consider that having your application fail with an error message that identifies the missing assembly is likely to provide a better user experience than automatically using an unknown version of the assembly, which might cause unpredictable behavior and security holes.

Vermeiden des Ladens von Assemblys in mehrere KontexteAvoid Loading an Assembly into Multiple Contexts

Das Laden einer Assembly in mehrere Kontexte kann zu Problemen mit der Typidentität führen.Loading an assembly into multiple contexts can cause type identity problems. Wenn der gleiche Typ aus der gleichen Assembly in zwei verschiedene Kontexte geladen wurde, ist dies so, als wären zwei verschiedene Typen mit dem gleichen Namen geladen worden.If the same type is loaded from the same assembly into two different contexts, it is as if two different types with the same name had been loaded. Eine InvalidCastException wird ausgelöst, wenn Sie versuchen, einen Typ in einen anderen umzuwandeln. Dabei wird die verwirrende Nachricht angezeigt, dass Typ MyType nicht in Typ MyType umgewandelt werden kann.An InvalidCastException is thrown if you try to cast one type to the other, with the confusing message that type MyType cannot be cast to type MyType.

Nehmen Sie z.B. an, dass die ICommunicate-Schnittstelle in einer Assembly mit dem Namen Utility deklariert wird, auf die von Ihrem Programm sowie von anderen von Ihrem Programm geladenen Assemblys verwiesen wird.For example, suppose that the ICommunicate interface is declared in an assembly named Utility, which is referenced by your program and also by other assemblies that your program loads. Diese andere Assembly enthält Typen, die die ICommunicate-Schnittstelle implementieren. So können diese von Ihrem Programm verwendet werden.These other assemblies contain types that implement the ICommunicate interface, allowing your program to use them.

Überlegen Sie jetzt, was passiert, wenn Ihr Programm ausgeführt wird.Now consider what happens when your program is run. Assemblys, auf die von Ihrem Programm verwiesen wird, werden in den Standard-Load-Kontext geladen.Assemblies that are referenced by your program are loaded into the default load context. Wenn Sie eine Zielassembly anhand deren Identität mit der Load-Methode laden, befindet sich diese sowie ihre Abhängigkeiten im Standard-Load-Kontext.If you load a target assembly by its identity, using the Load method, it will be in the default load context, and so will its dependencies. Sowohl Ihr Programm als auch die Zielassembly verwenden die gleiche Utility-Assembly.Both your program and the target assembly will use the same Utility assembly.

Stellen Sie sich aber jetzt vor, Sie würden Ihre Zielassembly mit ihrem Dateipfad mit der LoadFile-Methode laden.However, suppose you load the target assembly by its file path, using the LoadFile method. Die Assembly wird ohne Kontext geladen, weshalb ihre Abhängigkeiten nicht automatisch geladen werden.The assembly is loaded without any context, so its dependencies are not automatically loaded. Möglicherweise haben Sie einen Handler für das AppDomain.AssemblyResolve-Ereignis, um die Abhängigkeit bereitzustellen. Unter Umständen lädt er die Utility-Assembly ohne Kontext mit der Methode LoadFile.You might have a handler for the AppDomain.AssemblyResolve event to supply the dependency, and it might load the Utility assembly with no context by using the LoadFile method. Wenn Sie jetzt eine Instanz eines Typs erstellen, der in der Zielassembly enthalten ist, und versuchen, diesen einer Variablen mit dem Typ ICommunicate zuzuweisen, wird eine InvalidCastException ausgelöst, da die Runtime die ICommunicate-Schnittstellen in den zwei Kopien der Utility-Assembly als von unterschiedlichen Typen ansieht.Now when you create an instance of a type that is contained in the target assembly and try to assign it to a variable of type ICommunicate, an InvalidCastException is thrown because the runtime considers the ICommunicate interfaces in the two copies of the Utility assembly to be different types.

Es gibt viele andere Szenarios, in denen eine Assembly in mehrere Kontexte geladen werden kann.There are many other scenarios in which an assembly can be loaded into multiple contexts. Am besten vermeiden Sie Konflikte, indem Sie die Zielassembly in Ihrem Anwendungspfad verschieben und die Load-Methode mit dem vollständigen Anzeigenamen verwenden.The best approach is to avoid conflicts by relocating the target assembly in your application path and using the Load method with the full display name. Dann wird die Assembly in den Standard-Load-Kontext geladen, und beide Assemblys verwenden dieselbe Utility-Assembly.The assembly is then loaded into the default load context, and both assemblies use the same Utility assembly.

Wenn die Zielassembly außerhalb Ihres Anwendungspfads bleiben muss, können Sie die LoadFrom-Methode verwenden, um sie in den LoadFrom-Kontext zu laden.If the target assembly must remain outside your application path, you can use the LoadFrom method to load it into the load-from context. Wenn die Zielassembly mit einem Verweis auf die Utility-Assembly der Anwendung kompiliert wurde, verwendet sie die Utility-Assembly, die Ihre Anwendung in den Standard-Load-Kontext geladen hat.If the target assembly was compiled with a reference to your application's Utility assembly, it will use the Utility assembly that your application has loaded into the default load context. Beachten Sie, dass Probleme auftreten können, wenn die Zielassembly eine Abhängigkeit auf einer Kopie der Utility-Assembly hat, die sich außerhalb des Anwendungspfads befindet.Note that problems can occur if the target assembly has a dependency on a copy of the Utility assembly located outside your application path. Wenn diese Assembly in den LoadFrom-Kontext geladen wird, bevor Ihre Anwendung die Utility-Assembly lädt, schlägt der Ladevorgang Ihrer Anwendung fehl.If that assembly is loaded into the load-from context before your application loads the Utility assembly, your application's load will fail.

Im Abschnitt Ziehen Sie in Erwägung, zum Standard-Load-Kontext zu wechseln werden Alternativen zum Laden von Dateipfaden erläutert, wie etwa LoadFile und LoadFrom.The Consider Switching to the Default Load Context section discusses alternatives to using file path loads such as LoadFile and LoadFrom.

Vermeiden des Ladens von mehreren Versionen einer Assembly in denselben KontextAvoid Loading Multiple Versions of an Assembly into the Same Context

Das Laden von mehreren Assemblyversionen in einen Load-Kontext kann zu Problemen mit der Typidentität führen.Loading multiple versions of an assembly into one load context can cause type identity problems. Wenn der gleiche Typ aus der zwei Versionen derselben Assembly geladen wurde, ist dies so, als wären zwei verschiedene Typen mit dem gleichen Namen geladen worden.If the same type is loaded from two versions of the same assembly, it is as if two different types with the same name had been loaded. Eine InvalidCastException wird ausgelöst, wenn Sie versuchen, einen Typ in einen anderen umzuwandeln. Dabei wird die verwirrende Nachricht angezeigt, dass Typ MyType nicht in Typ MyType umgewandelt werden kann.An InvalidCastException is thrown if you try to cast one type to the other, with the confusing message that type MyType cannot be cast to type MyType.

Ihr Programm lädt z.B. möglicherweise eine Version der Utility-Assembly direkt, aber zu einem späteren Zeitpunkt lädt es möglicherweise eine andere Assembly, die eine andere Version der Utility-Assembly lädt.For example, your program might load one version of the Utility assembly directly, and later it might load another assembly that loads a different version of the Utility assembly. Es kann auch sein, dass ein Codefehler dazu führt, dass zwei unterschiedliche Codepfade Ihrer Anwendung verschiedene Versionen einer Assembly laden.Or a coding error might cause two different code paths in your application to load different versions of an assembly.

Dieses Problem kann im Standard-Load-Kontext auftreten, wenn Sie die Assembly.Load-Methode verwenden und vollständige Assemblyanzeigenamen angeben, die verschiedene Versionsnummern enthalten.In the default load context, this problem can occur when you use the Assembly.Load method and specify complete assembly display names that include different version numbers. Das Problem kann bei Assemblys, die ohne Kontext geladen wurden, durch das Verwenden der Assembly.LoadFile-Methode zum Laden der gleichen Assembly aus einem anderen Pfad verursacht werden.For assemblies that are loaded without context, the problem can be caused by using the Assembly.LoadFile method to load the same assembly from different paths. Die Runtime sieht zwei Assemblys, die aus verschiedenen Pfaden geladen wurden, als unterschiedlich an, auch wenn deren Identitäten übereinstimmen.The runtime considers two assemblies that are loaded from different paths to be different assemblies, even if their identities are the same.

Neben Problemen mit der Typidentität können mehrere Versionen einer Assembly eine MissingMethodException verursachen, wenn ein Typ, der aus einer Version der Assembly geladen wird, an Code übergeben wird, der diesen Typ einer anderen Version erwartet.In addition to type identity problems, multiple versions of an assembly can cause a MissingMethodException if a type that is loaded from one version of the assembly is passed to code that expects that type from a different version. Der Code erwartet z.B. möglicherweise eine Methode, die in einer späteren Version hinzugefügt wurde.For example, the code might expect a method that was added to the later version.

Geringfügigere Fehler können auftreten, wenn das Verhalten des Typs von einer Version zur anderen geändert wurde.More subtle errors can occur if the behavior of the type changed between versions. Eine Methode kann z.B. eine unerwartete Ausnahme auslösen oder einen unerwarteten Wert zurückgeben.For example, a method might throw an unexpected exception or return an unexpected value.

Überprüfen Sie Ihren Code gründlich, um sicherzustellen, dass nur eine Version einer Assembly geladen wird.Carefully review your code to ensure that only one version of an assembly is loaded. Sie können die AppDomain.GetAssemblies-Methode verwenden, um zu bestimmten, welche Assemblys zu einem gegebenen Zeitpunkt geladen werden.You can use the AppDomain.GetAssemblies method to determine which assemblies are loaded at any given time.

Ziehen Sie in Erwägung, zum Standard-Load-Kontext zu wechselnConsider Switching to the Default Load Context

Schauen Sie sich die Muster Ihrer Anwendung zum Laden und Bereitstellen von Assemblys an.Examine your application's assembly loading and deployment patterns. Können Sie aus Bytearrays geladene Assemblys beseitigen?Can you eliminate assemblies that are loaded from byte arrays? Können Sie Assemblys in den Suchpfad verschieben?Can you move assemblies into the probing path? Wenn sich Assemblys im globalen Assemblycache oder im Suchpfad der Anwendungsdomäne befinden (d.h. deren ApplicationBase und PrivateBinPath), können Sie die Assembly anhand ihrer Identität laden.If assemblies are located in the global assembly cache or in the application domain's probing path (that is, its ApplicationBase and PrivateBinPath), you can load the assembly by its identity.

Wenn Sie Ihre Assemblys nicht alle in den Suchpfad verschieben können, ziehen Sie Alternativen wie das Add-In-Modell von .NET Framework, das Platzieren von Assemblys in den globalen Assemblycache oder das Erstellen einer Anwendungsdomäne in Erwägung.If it is not possible to put all your assemblies in the probing path, consider alternatives such as using the .NET Framework add-in model, placing assemblies into the global assembly cache, or creating application domains.

Ziehen Sie in Erwägung das Add-In-Modell von .NET Framework zu verwendenConsider Using the .NET Framework Add-In Model

Wenn Sie den LoadFrom-Kontext verwenden, um Add-Ins zu implementieren, die für gewöhnlich nicht in der Anwendungsbasis installiert sind, verwenden Sie das Add-In-Modell von .NET Framework.If you are using the load-from context to implement add-ins, which typically are not installed in the application base, use the .NET Framework add-in model. Dieses Modell ermöglicht die Isolation auf der Anwendungsdomänen- oder Prozessebene, ohne dass Sie die Anwendungsdomäne selbst verwalten müssen.This model provides isolation at the application domain or process level, without requiring you to manage application domains yourself. Weiter Informationen zum Add-In-Modell finden Sie unter Add-ins and Extensibility (Add-Ins und Erweiterbarkeit).For information about the add-in model, see Add-ins and Extensibility.

Ziehen Sie in Erwägung, den globalen Assemblycache zu verwendenConsider Using the Global Assembly Cache

Platzieren Sie Assemblys in den globalen Assemblycache, um vom Pfad der freigegebenen Assembly zu profitieren, die sich außerhalb der Anwendungsbasis befindet. Dabei büßen Sie aber nichts an den Vorteilen des Standard-Load-Kontexts ein. Ebenso wenig müssen Sie sich mit den Nachteilen der anderen Kontexte auseinandersetzen.Place assemblies in the global assembly cache to get the benefit of a shared assembly path that is outside the application base, without losing the advantages of the default load context or taking on the disadvantages of the other contexts.

Ziehen Sie in Erwägung, Anwendungsdomänen zu verwendenConsider Using Application Domains

Wenn Sie bestimmen, dass einige Assemblys nicht im Suchpfad der Anwendung bereitgestellt werden können, ziehen Sie in Erwägung, eine neue Anwendungsdomäne für diese Assemblys zu erstellen.If you determine that some of your assemblies cannot be deployed in the application's probing path, consider creating a new application domain for those assemblies. Verwenden Sie AppDomainSetup, um neue Anwendungsdomänen zu erstellen, und verwenden Sie die AppDomainSetup.ApplicationBase-Eigenschaft, um den Pfad anzugeben, der die Assembly enthält, die Sie laden möchten.Use an AppDomainSetup to create the new application domain, and use the AppDomainSetup.ApplicationBase property to specify the path that contains the assemblies you want to load. Wenn Sie mehrere Verzeichnisse durchsuchen müssen, können Sie ApplicationBase auf ein Stammverzeichnis festlegen und die AppDomainSetup.PrivateBinPath-Eigenschaft verwenden, um die zu durchsuchenden Unterverzeichnisse zu identifizieren.If you have multiple directories to probe, you can set the ApplicationBase to a root directory and use the AppDomainSetup.PrivateBinPath property to identify the subdirectories to probe. Alternativ können Sie auch mehrere Anwendungsdomänen erstellen und ApplicationBase jeder Anwendungsdomäne auf den entsprechenden Pfad für deren Assemblys festlegen.Alternatively, you can create multiple application domains and set the ApplicationBase of each application domain to the appropriate path for its assemblies.

Beachten Sie, dass Sie diese Assemblys mit der Assembly.LoadFrom-Methode laden können.Note that you can use the Assembly.LoadFrom method to load these assemblies. Da sie sich nun im Suchpfad befinden, werden sie in den Standard-Load-Kontext geladen statt in den LoadFrom-Kontext.Because they are now in the probing path, they will be loaded into the default load context instead of the load-from context. Es wird allerdings empfohlen, dass Sie zur Assembly.Load-Methode wechseln und vollständige Assemblyanzeigenamen angeben, um sicherzustellen, dass immer die korrekten Versionen verwendet werden.However, we recommend that you switch to the Assembly.Load method and supply full assembly display names to ensure that correct versions are always used.

Siehe auchSee Also

Assembly.Load
Assembly.LoadFrom
Assembly.LoadFile
AppDomain.AssemblyResolve
Add-Ins und ErweiterbarkeitAdd-ins and Extensibility