Heim >Backend-Entwicklung >C++ >Wie lade ich Assembly-Referenzen rekursiv in eine separate AppDomain?

Wie lade ich Assembly-Referenzen rekursiv in eine separate AppDomain?

Barbara Streisand
Barbara StreisandOriginal
2025-01-15 11:51:45820Durchsuche

How to Recursively Load Assembly References into a Separate AppDomain?

Laden Sie die Assembly und ihre Referenzen rekursiv in eine eigenständige AppDomain

Stellen Sie beim Laden einer Assembly in eine neue AppDomain sicher, dass alle ihre Referenzen rekursiv geladen werden, um FileNotFoundExceptionFehler zu vermeiden. In diesem Artikel werden die Schritte zur Bewältigung dieser komplexen Aufgabe erläutert.

Erstellen Sie zunächst eine eigenständige AppDomain mit einem benutzerdefinierten ApplicationBase. Verwenden Sie dann AssemblyName.GetAssemblyName, um die Root-Assembly zu laden. Dies allein reicht jedoch nicht aus; Sie müssen die Referenz der Baugruppe manuell laden.

Verwenden Sie dazu ReflectionOnlyLoadFrom, um eine Liste der referenzierten Assemblys abzurufen, ohne diese tatsächlich zu laden. Verwenden Sie für jede Referenz domain.Load(refAsmName), um sie in die AppDomain zu laden.

Hier gibt es jedoch eine Einschränkung. Um ein Proxy-Objekt in einer externen Anwendungsdomäne auszuführen, müssen Sie CreateInstanceAndUnwrap aufrufen. Diese Methode stellt sicher, dass das Objekt in der Ziel-AppDomain ausgeführt wird.

Codebeispiel zur Veranschaulichung dieses Prozesses:

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        AppDomainSetup domaininfo = new AppDomainSetup();
        domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
        Evidence adevidence = AppDomain.CurrentDomain.Evidence;
        AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);

        Type type = typeof(Proxy);
        var value = (Proxy)domain.CreateInstanceAndUnwrap(
            type.Assembly.FullName,
            type.FullName);

        var assembly = value.GetAssembly(args[0]);
        // AppDomain.Unload(domain);
    }
}

public class Proxy : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFile(assemblyPath);
        }
        catch (Exception)
        {
            return null;
            // throw new InvalidOperationException(ex);
        }
    }
}</code>

Denken Sie daran, dass Sie bei Verwendung von LoadFile anstelle von LoadFrom alle Abhängigkeiten selbst laden müssen, um FileNotFound-Ausnahmen zu vermeiden.

Das obige ist der detaillierte Inhalt vonWie lade ich Assembly-Referenzen rekursiv in eine separate AppDomain?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn