C# 如何将变量从一个应用程序域传递到另一个应用程序域
我想知道,如果我有一个变量,例如字符串,如何将其值传递给我的新应用程序域:C# 如何将变量从一个应用程序域传递到另一个应用程序域,c#,.net,vb.net,cross-domain,appdomain,C#,.net,Vb.net,Cross Domain,Appdomain,我想知道,如果我有一个变量,例如字符串,如何将其值传递给我的新应用程序域: static string _str; static void Main(string[] args) { _str = "abc"; AppDomain domain = AppDomain.CreateDomain("Domain666"); domain.DoCallBack(MyNewAppDomainMethod); AppDomain.Unload(domain);
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"
}
谢谢使用AppDomain.CreateDomain的一个变体,该变体采用AppDomainSetup参数。在AppDomainSetup对象中,将AppDomainInitializerArguments成员设置为要传递给新应用程序域的字符串数组 请参阅上的示例代码 对于问题中的代码,更改可能如下(未测试):
我知道这是一条古老的线索,但也许这会帮助其他正在研究这个课题的人
在中,作者建议使用application domain
SetData
和GetData
方法对支持按值封送或按引用对象封送的数据对象进行基本交换。解决第一个和第二个需求(传递一个值并检索另一个值),下面是一个非常简单的解决方案:
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");
}
谢谢现在我想知道如何将信息返回到我的主appdomain。也就是说,返回一个对象。谢谢还有一个问题。我看到AppDomainInitializerArguments只接受字符串数组。在这种情况下,我实际上只需要字符串,所以没有问题,但是如果我需要其他类型的数据呢?对此无能为力?应用程序域不共享对象内存空间,因此传递对象需要某种序列化。要返回一个对象,您可以在原始的appdomain上进行DoCallBack,如果您能够得到它的话(我看不到一种简单的方法)。或者,您可以在appdomains之间建立其他形式的进程间通道,例如命名管道。这是一个很好的简单解决方案。谢谢我想强调的是,回调函数必须声明为静态,否则您将无法在新的AppDomain中工作。X
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");
}