c# - definicion - ¿Cómo creo un dominio de aplicación y ejecuto mi aplicación en él?
dominio de aplicacion definicion (2)
Necesito crear un dominio de aplicación personalizado para solucionar un error en el comportamiento predeterminado de .NET runtime. Ninguno de los códigos de muestra que he visto en línea es útil ya que no sé dónde colocarlos o qué debe reemplazar dentro de mi método Main()
.
Necesitas:
1) Cree una instancia del objeto AppDomainSetup y rellénelo con la información de configuración que desea para su dominio
2) Cree su nuevo dominio utilizando el método AppDomain.CreateDoman. La instancia de AppDomainSetup con parámetros de configuración se pasa al método CreateDomain.
3) Cree una instancia de su objeto en el nuevo dominio utilizando el método CreateInstanceAndUnwrap en el objeto de dominio. Este método toma el nombre de tipo del objeto que desea crear y devuelve un proxy remoto que puede usar en su dominio principal para comunicarse con el objeto creado en el nuevo.
Una vez que haya terminado con estos 3 pasos, puede llamar a los métodos en el otro dominio a través del proxy. También puede descargar el dominio una vez que haya terminado y volver a cargarlo.
Este topic en la ayuda de MSDN tiene un ejemplo bastante detallado de lo que necesita
Probablemente, se debe tener en cuenta que crear AppDomains solo para sortear algo que se puede arreglar con una cadena constante es probablemente la forma incorrecta de hacerlo. Si está intentando hacer lo mismo que el enlace que anotó, podría hacer esto:
var configFile = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(configFile))
throw new Exception("do your worst!");
Punto de entrada recursivo : o)
static void Main(string[] args)
{
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
var currentAssembly = Assembly.GetExecutingAssembly();
var otherDomain = AppDomain.CreateDomain("other domain");
var ret = otherDomain.ExecuteAssemblyByName(currentAssembly.FullName, args);
Environment.ExitCode = ret;
return;
}
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("Hello");
}
Muestra rápida utilizando un punto de entrada secundario no estático y MarshalByRefObject ...
class Program
{
static AppDomain otherDomain;
static void Main(string[] args)
{
otherDomain = AppDomain.CreateDomain("other domain");
var otherType = typeof(OtherProgram);
var obj = otherDomain.CreateInstanceAndUnwrap(
otherType.Assembly.FullName,
otherType.FullName) as OtherProgram;
args = new[] { "hello", "world" };
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
obj.Main(args);
}
}
public class OtherProgram : MarshalByRefObject
{
public void Main(string[] args)
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
foreach (var item in args)
Console.WriteLine(item);
}
}