Devo creare un dominio applicazione personalizzato per ovviare a un errore nel runtime di .NET default behavior. Nessuno del codice di esempio che ho visto online è utile poiché non so dove collocarlo o cosa deve essere sostituito nel mio metodo Main()
.Come posso creare un dominio dell'applicazione ed eseguire la mia applicazione al suo interno?
risposta
Si dovrebbe probabilmente essere notato che la creazione di AppDomains solo per ottenere intorno a qualcosa che può essere fissato con una stringa costante è probabilmente il modo più sbagliato per farlo . Se si sta cercando di fare la stessa cosa come il collegamento si è preso nota, si può solo fare questo:
var configFile = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(configFile))
throw new Exception("do your worst!");
ricorsivo Entry Point: 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");
}
campione rapida utilizzando un non statico secondaria punto di ingresso e 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);
}
}
è necessario:
1) Creare un'istanza oggetto AppDomainSetup e popolarlo con le informazioni di configurazione che si desidera per il tuo dominio
2) Crea il tuo nuovo dominio utilizzando AppDomain.CreateDoman metodo. L'istanza AppDomainSetup con parametri di configurazione viene passata al metodo CreateDomain.
3) Creare un'istanza del proprio oggetto nel nuovo dominio utilizzando il metodo CreateInstanceAndUnwrap sull'oggetto dominio. Questo metodo prende nome tipografico dell'oggetto che si desidera creare e restituisce un proxy remoto che può essere utilizzato nel proprio dominio principale per comunicare con l'oggetto creato nel nuovo
Una volta che si è in grado di chiamare questi metodi, è possibile chiamare i metodi in l'altro dominio tramite il proxy. Puoi anche scaricare il dominio dopo aver finito e ricaricarlo di nuovo.
Questo topic in MSDN aiuto deve esempio abbastanza dettagliata di che cosa avete bisogno
Questo è più o meno quello che ho visto negli esempi che ho visto altrove, ma non fornisce alcuna delle informazioni che mi mancano ancora. Ho appena chiamato Application.Run (nuovo MyForm)? Devo estrarre tutto il codice di avvio esistente dal mio metodo Main, trasferirlo in un nuovo metodo e chiamarlo per avviare la mia app? Nessuna delle precedenti perché sono ancora più confuso di quanto penso di essere? –
L'oggetto a cui si sta tentando di ottenere il proxy deve essere "MarshalByRefObject" oppure tenterà semplicemente di serializzare una copia nell'appDomain originale. –
@ Matthew Whited - hai ragione, ho dimenticato di menzionare che – mfeingold
- 1. Come posso utilizzare la funzione lambda al suo interno?
- 2. Come caricare dinamicamente la mia libreria e invocare un metodo al suo interno?
- 3. android come creare la mia attività ed estenderla?
- 4. Come posso rendere la mia applicazione scrivibile in C#?
- 5. GoogleApps - Come posso distribuire la mia applicazione
- 6. Come posso riavviare la mia applicazione iphone
- 7. La mia libreria R è rossa ma posso creare ed eseguire app normalmente
- 8. Come posso spostare la mia configurazione xml primaverile al di fuori della mia applicazione web?
- 9. Posso distribuire un JDK con la mia applicazione?
- 10. Come posso eseguire il debug remoto della mia applicazione rcp?
- 11. Un comando per creare una directory e un file al suo interno linux commad
- 12. Come creare un controllo utente in cui è possibile rilasciare altri controlli al suo interno?
- 13. Come denominare la mia applicazione distribuita?
- 14. get nome della funzione al suo interno
- 15. Come posso creare un "componente aggiuntivo per la licenza" per la mia applicazione Android?
- 16. Perché la mia classe non può implementare un'interfaccia dichiarata al suo interno?
- 17. Come posso inviare un fax con la mia applicazione Qt?
- 18. Come creare ed eseguire la sorgente BIRT in Eclipse Mars
- 19. Come posso impacchettare la mia applicazione linux usando MonoDevelop?
- 20. Posso precompilare la mia applicazione ASP.NET MVC?
- 21. come eseguire la mia applicazione in background in iphone?
- 22. come scrivere ed eseguire un thread
- 23. Come posso utilizzare Mono.WebServer (XSP) per eseguire la mia applicazione MVC ASP mono?
- 24. Come aumentare la larghezza div in base al testo al suo interno?
- 25. utilizzando java per creare una nuova directory e un file al suo interno
- 26. Come posso distribuire la mia applicazione zend framework 2 al beanstalk elastico AWS?
- 27. Come creare un DSL interno in Scala?
- 28. Lucene 6.0! Come creare un'istanza di BooleanQuery e aggiungere altre query di ricerca al suo interno?
- 29. Come posso creare un elenco "Apri con" come in Esplora nella mia applicazione
- 30. AntiVirus uccide la mia applicazione
Grazie. C'è una ragione per preferire un approccio all'altro? –
Il primo probabilmente sarebbe più pulito. Ti consentirebbe di utilizzare un punto di ingresso standard invece di dover creare un oggetto che avrebbe bisogno di essere eseguito il marshalling attraverso le appdomain. Il secondo approccio è più tipico.Ma è normalmente utilizzato per i plug-in e non il principale punto di accesso dell'app. –
C'è anche un metodo '.ExecuteAssembly (...)' sull'oggetto 'AppDomain' che è possibile fornire il percorso a un altro assembly che contiene un punto di ingresso. Ciò potrebbe consentire un design leggermente più pulito, ma richiederebbe almeno due assiemi. –