Cargar / descargar ensamblaje en diferentes AppDomain

Necesito ejecutar un método en un ensamblaje cargado durante el tiempo de ejecución. Ahora quiero descargar esos ensamblados cargados después de la llamada al método. Sé que necesito un nuevo dominio de aplicación para poder descargar las bibliotecas. Pero aquí surge el problema.

Los ensamblajes que se van a cargar son complementos en el marco de mi complemento. No tienen ningún punto de entrada. Todo lo que sé es que contienen algunos tipos que implementan una interfaz determinada. El código antiguo, no perteneciente al dominio de aplicación se ve así (ligeramente acortado):

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;
}

Ahora quiero que se carguen en un dominio de aplicación propio:

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);
}

Como puedes ver, he puesto en 5 casos.

Si configuro el controlador de eventos, obtengo una excepción que indica que no se pudo encontrar / cargar el ensamblaje (es un complemento de la consola de administración (mmc.exe).

ExecuteAssembly no encuentra un punto de entrada (bueno, no hay ninguno).

No tengo ni idea de cómo se nombra el tipo. ¿Cómo cargar por interfaz?

Similar a 3. ¿Cómo obtener el nombre de una asamblea?

El mismo error que en 1.

Creo que el problema podría ser la consola de administración de alguna manera o simplemente no tengo ni idea de lo que estoy haciendo mal. Cualquier ayuda es apreciada.

ACTUALIZACIÓN 1

Ahora he intentado usar la solución proxy publicada.

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...
    }
}

Esto tampoco funciona. Cuando intento crear el objeto proxy, obtengo una excepción:

No se pudo cargar el archivo o el ensamblaje 'MyProject.SnapIn, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.

El archivo en el mensaje de error se carga en mmc (el complemento). ¿Alguna idea de cómo solucionar este error? No se llama a AppDomain.AssemblyResolve (ni en el dominio antiguo ni en el nuevo).

ACTUALIZACIÓN 2

Ahora he intentado la solución con el AppDomainSetup. Ahora, la excepción ha cambiado a:

No se pudo cargar el archivo o el ensamblado 'archivo: /// C: /Desarrollo/MyProject/bin/SnapIn/MyProject.SnapIn.DLL' o una de sus dependencias. El nombre de ensamblado dado o base de código no es válido. (Excepción de HRESULT: 0x80131047)

¿Alguna idea?

Respuestas a la pregunta(3)

Su respuesta a la pregunta