2009-08-09 10 views
11

Je voudrais savoir, si j'ai une variable, par exemple, une chaîne, comment passer sa valeur à mon nouveau domaine d'application:Comment passer une variable d'un domaine d'application à un autre

static string _str; 

static void Main(string[] args) { 
    _str = "abc"; 
    AppDomain domain = AppDomain.CreateDomain("Domain666"); 
    domain.DoCallBack(MyNewAppDomainMethod); 
    AppDomain.Unload(domain); 
    Console.WriteLine("Finished"); 
    Console.ReadKey(); 
} 

static void MyNewAppDomainMethod() { 
    Console.WriteLine(_str); //want this to print "abc" 
} 

Merci

Répondre

11

Utilisez l'une des variantes de AppDomain.CreateDomain qui prend un argument AppDomainSetup. Dans l'objet AppDomainSetup, définissez le membre AppDomainInitializerArguments sur le tableau de chaînes que vous voulez transmettre au nouveau domaine d'application.

Voir l'exemple de code au http://msdn.microsoft.com/en-us/library/system.appdomainsetup.appdomaininitializerarguments.aspx.

Avec le code dans la question, le changement pourrait ressembler (non testé):

static voide Main(string[] args) { 
    _str = "abc"; 

    AppDomainSetup setup = new AppDomainSetup(); 
    setup.AppDomainInitializer = new AppDomainInitializer(MyNewAppDomainMethod); 
    setup.AppDomainInitializerArguments = new string[] { _str }; 

    AppDomain domain = AppDomain.CreateDomain(
     "Domain666", 
     new Evidence(AppDomain.CurrentDomain.Evidence), 
     setup); 

    Console.WriteLine("Finished"); 
    Console.ReadKey(); 
} 

static void MyNewAppDomainMethod(string[] args) { 
    ... 
} 
+1

Merci. Maintenant, j'aimerais savoir comment obtenir des informations sur mon domaine principal. C'est-à-dire, retourner un objet. Merci! –

+0

Et une autre question. Je vois AppDomainInitializerArguments n'accepte qu'un tableau de chaînes. Dans ce cas, je ne veux vraiment que des chaînes, donc il n'y a pas de problème, mais si je voulais d'autres types de données? Rien à faire à ce sujet? –

+0

Les domaines d'application ne partagent pas un espace mémoire d'objet, et donc la transmission d'objets nécessite une sérialisation quelconque. Pour retourner un objet, vous pouvez faire DoCallBack sur le domaine d'origine, si vous pouvez vous en procurer (je ne vois pas de moyen facile de le faire). Vous pouvez également établir une autre forme de canal interprocessus entre les domaines d'application, par ex. un tuyau nommé. –

4

Je sais que c'est un vieux fil, mais peut-être cela aidera d'autres personnes qui font des recherches sur le sujet.

Dans this article, l'auteur propose d'utiliser domaine d'application SetData et GetData méthodes pour l'échange de base d'objets de données qui prennent en charge le maréchal par valeur ou maréchal par référence objet.

17

répondant à la fois votre premier et deuxième exigences (en passant par une valeur et une autre valeur de retour la récupération), voici une solution assez simple:

static void Main(string[] args) 
{ 
    AppDomain domain = AppDomain.CreateDomain("Domain666"); 
    domain.SetData("str", "abc"); 
    domain.DoCallBack(MyNewAppDomainMethod); 
    string str = domain.GetData("str") as string; 
    Debug.Assert(str == "def"); 
} 

static void MyNewAppDomainMethod() 
{ 
    string str = AppDomain.CurrentDomain.GetData("str") as string; 
    Debug.Assert(str == "abc"); 
    AppDomain.CurrentDomain.SetData("str", "def"); 
} 
+0

Merci, c'était la meilleure réponse pour moi! – bas

Questions connexes