Ejecutar código desde un AppDomain personalizado

Tengo el siguiente complemento:

IPlugin.cs:

namespace StandalonePlugin
{
    public interface IPlugin
    {
        string Execute(string data);
    }
}

Complemento independiente.cs:

namespace StandalonePlugin
{
    [Export(typeof(IPlugin))]
    public class StandalonePlugin : IPlugin
    {
        public string Execute(string data)
        {
            StringBuilder result = new StringBuilder();
            result.AppendFormat("Plugintype: {0}\r\n", this.GetType().FullName);
            result.AppendFormat("Data: {0}\r\n", data);
            result.AppendFormat("AppDomain: {0}\r\n", AppDomain.CurrentDomain.FriendlyName);
            result.AppendFormat("Current Dir: {0}\r\n", Environment.CurrentDirectory);
            result.AppendFormat("Assembly location: {0}\r\n", Assembly.GetExecutingAssembly().Location);

            return result.ToString();
        }
    }
}

Y finalmente el código cargando el complemento y llamando a su método Execute:

namespace CustomAppDomain
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
            setup.PrivateBinPath = @".";

            AppDomain pluginDomain = AppDomain.CreateDomain("PluginDomain", null, setup);

            string pathToDll = @"D:\Code\LearningPlugins\StandalonePlugin\bin\Debug";
            Type t = typeof(IPlugin);
            IPlugin plugin = (IPlugin)pluginDomain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

            Console.WriteLine(plugin.Execute("Test"));

            Console.WriteLine("<ENTER> to continue");
            Console.ReadLine();
        }
    }
}

Aquí está el resultado:

> Plugintype: StandalonePlugin.StandalonePlugin 
> Data: Test 
> AppDomain:LearningPlugins.vshost.exe 
> Current Dir: D:\Code\LearningPlugins\LearningPlugins\bin\Debug 
> Assembly location: D:\Code\LearningPlugins\LearningPlugins\bin\Debug\StandalonePlugin.dll
> 
> <ENTER> to continue

Ahora la pregunta: ¿Por qué la lista AppDomain LearningPlugins.exe en lugar de PluginDomain, como se especifica en AppDomain pluginDomain = AppDomain.CreateDomain("PluginDomain", null, setup); ?

Para aclarar, no me importa que se agregue vshost. Me pregunto por qué AppDomain PluginDomain no se muestra. Parece que se usa el dominio de aplicación principal aunque quiero crear un dominio de aplicación adicional para el complemento

preguntado el 22 de mayo de 12 a las 12:05

@Raphaël Althaus: deshabilité el proceso de hospedaje de Visual Studio y sigo obteniendo LearningPlugins.exe como AppDomain. Mi pregunta es: ¿Por qué no se usa el PluginDomain que creé específicamente? -

2 Respuestas

Cuando inicia la aplicación en modo de depuración, vshost se agrega al nombre descriptivo. La solución es usar la expresión regular

string myName = Regex.Replace(AppDomain.CurrentDomain.FriendlyName, 
    @"(?<basename>.*).vshost(?<extension>\..*)", "${basename}${extension}");

Propósito de contrahost
También puede verificar AppDomain.FriendlyName , el asunto de

contestado el 22 de mayo de 12 a las 12:05

Es porque estas usando AppDomain.CurrentDomain.FriendlyName.

Como se explica en msdn ( http://msdn.microsoft.com/en-us/library/system.appdomain.friendlyname )

El nombre descriptivo del dominio de aplicación predeterminado es el nombre de archivo del ejecutable del proceso.

=> LearningPlugin.exe para usted

Así que deberías hacer algo así.

en Principal:

Console.WriteLine(plugin.Execute("Test", pluginDomain));

en complemento independiente:

public string Execute(string data, AppDomain childDomain)
        {
            StringBuilder result = new StringBuilder();
            result.AppendFormat("Plugintype: {0}\r\n", this.GetType().FullName);
            result.AppendFormat("Data: {0}\r\n", data);
            result.AppendFormat("AppDomain: {0}\r\n", childDomain.FriendlyName);//CHANGE HERE
            result.AppendFormat("Current Dir: {0}\r\n", Environment.CurrentDirectory);
            result.AppendFormat("Assembly location: {0}\r\n", Assembly.GetExecutingAssembly().Location);

            return result.ToString();
        }

contestado el 22 de mayo de 12 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.