Laden / Entladen einer Baugruppe in einer anderen AppDomain

Ich muss eine Methode in einer Assembly ausführen, die zur Laufzeit geladen wird. Jetzt möchte ich diese geladenen Assemblys nach dem Methodenaufruf entladen. Ich weiß, dass ich eine neue AppDomain benötige, damit ich die Bibliotheken entladen kann. Aber hier tritt das Problem auf.

Die zu ladenden Assemblys sind Plugins in meinem Plugin-Framework. Sie haben überhaupt keinen Einstiegspunkt. Ich weiß nur, dass sie einige Typen enthalten, die eine bestimmte Schnittstelle implementieren. Der alte Nicht-AppDomain-Code sieht wie folgt aus (etwas gekürzt):

try
{
    string path = Path.GetFullPath("C:\library.dll");
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    Assembly asm = Assembly.LoadFrom(path);
    Type[] types = asm.GetExportedTypes();
    foreach (Type t in types)
    {
        if ((t.GetInterface("IStarter") != null) && !t.IsAbstract)
        {
            object tempObj = Activator.CreateInstance(t);
            MethodInfo info = t.GetMethod("GetParameters");
            if (info != null)
            {
                return info.Invoke(tempObj, null) as string;
            }
        }
    }
}
catch (Exception ex)
{
    MessageBox.Show(String.Format("Damn '{0}'.", ex.Message), "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name.StartsWith("MyProject.View,"))
    {
        string path = Path.GetFullPath("C:\view.dll"));
        return Assembly.LoadFrom(path);
    }
    return null;
}

Jetzt möchte ich, dass sie eine eigene AppDomain laden:

try
{
    string path = Path.GetFullPath("C:\library.dll");
    AppDomain domain = AppDomain.CreateDomain("TempDomain");
    domain.AssemblyResolve += CurrentDomain_AssemblyResolve;  // 1. Exception here!!
    domain.ExecuteAssembly(path);  // 2. Exception here!!
    domain.CreateInstanceFrom(...);  // 3. I have NO clue, how the type is named.
    domain.Load(...);  // 4. I have NO clue, how the assembly is named.
    domain.DoCallBack(...); // 5. Exception here!!
    // ...
}
catch (Exception ex)
{
    MessageBox.Show(String.Format("Damn '{0}'.", ex.Message), "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Wie Sie sehen, habe ich in 5 Fällen gestellt.

Wenn ich die Ereignisbehandlungsroutine einstelle, wird die Ausnahme angezeigt, dass das Assembly-Snap-In (es ist eine Verwaltungskonsole (mmc.exe)) nicht gefunden / geladen werden konnte.

ExecuteAssembly findet keinen Einstiegspunkt (naja, es gibt keinen).

Ich habe keine Ahnung, wie der Typ heißt. Wie lade ich per Schnittstelle?

Ähnlich wie bei 3. Wie erhalte ich den Namen einer Assembly?

Gleicher Fehler wie in 1.

Ich denke, das Problem könnte die Management-Konsole sein oder ich habe einfach keine Ahnung, was ich falsch mache. Jede Hilfe wird geschätzt.

UPDATE 1

Ich habe jetzt versucht, die veröffentlichte Proxy-Lösung zu verwenden.

AppDomain domain = AppDomain.CreateDomain("TempDomain");
InstanceProxy proxy = domain.CreateInstanceAndUnwrap(Assembly.GetAssembly(
    typeof(InstanceProxy)).FullName, typeof(InstanceProxy).ToString()) as InstanceProxy;
if (proxy != null)
{
    proxy.LoadAssembly(path);
}
AppDomain.Unload(domain);

public class InstanceProxy : MarshalByRefObject
{
    public void LoadAssembly(string path)
    {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        Assembly asm = Assembly.LoadFrom(path);
        Type[] types = asm.GetExportedTypes();
        // ...see above...
    }
}

Dies funktioniert auch nicht. Beim Versuch, das Proxy-Objekt zu erstellen, tritt eine Ausnahme auf:

Datei oder Assembly 'MyProject.SnapIn, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die angegebene Datei wurde vom System nicht gefunden.

Die Datei in der Fehlermeldung ist die in mmc geladene (das SnapIn). Irgendeine Idee, wie man diesen Fehler behebt? AppDomain.AssemblyResolve wird nicht aufgerufen (weder in der alten noch in der neuen Domäne).

UPDATE 2

Ich habe jetzt die Lösung mit dem AppDomainSetup ausprobiert. Jetzt wurde die Ausnahme geändert in:

Datei oder Assembly 'file: /// C: /Development/MyProject/bin/SnapIn/MyProject.SnapIn.DLL' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Der angegebene Assemblyname oder die angegebene Codebasis waren ungültig. (Ausnahme von HRESULT: 0x80131047)

Irgendeine Idee?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage