Necesito crear un dominio de aplicación personalizado para solucionar un error en default behavior del motor de ejecución de .NET. Ninguno del código de muestra que he visto en línea es útil, ya que no sé dónde colocarlo, o lo que necesita reemplazar en mi método Main()
.¿Cómo creo un dominio de aplicación y ejecuto mi aplicación en él?
Respuesta
Probablemente debe tenerse en cuenta que la creación de AppDomains sólo para obtener en torno a algo que puede ser fijado con una cadena constante es probablemente la manera incorrecta de hacerlo . Si usted está tratando de hacer lo mismo que el enlace que ha anotado, sólo podía hacer esto:
var configFile = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(configFile))
throw new Exception("do your worst!");
entrada recursiva Punto: 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 no estático secundaria punto de entrada 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);
}
}
es necesario:
1) Crea una instancia de objeto AppDomainSetup y rellenarla con la información de configuración que desee para su dominio
2) Crear su nuevo dominio mediante AppDomain.CreateDoman método. 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 typename 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 completado estos 3 pasos, puede llamar a los métodos en el otro dominio a través del proxy. También puede descargar el dominio después de que haya terminado y volver a cargarlo.
Este topic en MSDN ayuda tiene ejemplo bastante detallada de lo que necesita
Eso es más o menos lo que he visto en los ejemplos que he visto en otros lugares, pero no proporciona ninguna de la información que aún me falta. ¿Acabo de llamar a Application.Run (new MyForm)? ¿Corto todo el código de inicio existente de mi método Principal, lo meto en un nuevo método y lo llamo para iniciar mi aplicación? Ninguno de los anteriores porque estoy aún más confundido de lo que creo que estoy? –
El objeto del que intenta obtener el proxy debe ser 'MarshalByRefObject' o de lo contrario solo tratará de serializar una copia de regreso al AppDomain original. –
@Matthew Whited: tienes razón, olvidé mencionar que – mfeingold
- 1. ¿Cómo ejecuto un archivo por lotes desde mi aplicación Java?
- 2. ¿Cómo ejecuto tareas rastrillo dentro de mi aplicación rieles
- 3. ¿Cómo ejecuto unittest en una aplicación Tkinter?
- 4. Pasar y ejecutar delegar en un dominio de aplicación separado
- 5. ¿Cómo ejecutar un método en un dominio de aplicación separado?
- 6. ¿Por qué se crean tantos "postgres.exe" cuando ejecuto mi aplicación?
- 7. aplicación google appspot en un dominio personalizado?
- 8. CPU y tapa de memoria para un dominio de aplicación
- 9. ¿Qué es un dominio de aplicación .NET?
- 10. El dominio de mi aplicación no se descargará
- 11. ¿Qué es un dominio de aplicación .NET?
- 12. ¿Cómo ejecuto la aplicación una de otra en C#?
- 13. ¿Cuándo usaría un Dominio de aplicación?
- 14. ¿Cómo creo un "complemento de licencias" para mi aplicación de Android?
- 15. ¿Cómo creo un alias de Finder dentro de una aplicación?
- 16. ¿Cómo veo todos los métodos invocados cuando ejecuto mi aplicación en el simulador de iPhone?
- 17. ¿Cómo creo un puntaje global alto para mi aplicación de Android?
- 18. ¿Cómo uso OAuth en mi aplicación GWT?
- 19. ¿Cómo creo un paquete 'instalar' para una aplicación Qt?
- 20. Cargando archivos DLL en un dominio de aplicación diferente
- 21. ¿Cómo ejecuto programáticamente todas las pruebas JUnit en mi aplicación Java?
- 22. ¿Cómo puedo ejecutar una aplicación WPF en un nuevo dominio de aplicación? ExecuteAssembly falla
- 23. AppDomain Unload killing Parent Dominio de aplicación
- 24. ¿Cómo abro la aplicación de configuración desde mi aplicación?
- 25. Cocoa/iPhone: ¿Cómo creo una localización de mi aplicación en chino simplificado?
- 26. ¿Cómo ejecuto las pruebas JUnit desde dentro de mi aplicación java?
- 27. ¿Cómo ejecuto programáticamente una aplicación específica en Android?
- 28. ¿Cómo ejecutar la aplicación iphone GameCenter desde mi aplicación?
- 29. Califique mi aplicación en iTunes dentro de mi aplicación en iPhone
- 30. ¿Cómo reutilizar las clases de dominio de la aplicación Grails?
Gracias. ¿Hay alguna razón para preferir un acercamiento al otro? –
El primero probablemente sería más limpio. Le permitiría usar un punto de entrada estándar en lugar de tener que crear un objeto que tendría que ser ordenado a través de los dominios de aplicaciones. El segundo enfoque es más típico.Pero normalmente se usa para complementos y no como el principal punto de entrada de la aplicación. –
También hay un método '.ExecuteAssembly (...)' en el objeto 'AppDomain' que puede proporcionar la ruta a otro ensamblado que contiene un punto de entrada. Eso podría permitir un diseño ligeramente más limpio, pero requeriría al menos dos conjuntos. –