以下示例基于“在应用程序域之间来回传递值 https://stackoverflow.com/questions/1250774/passing-values-back-and-forth-appdomains”,其中 Marc Gravell 好心地为有关应用程序域之间的 .Net 远程处理的问题提供了非常好的答案。我所做的就是扩展它(非常天真?),期望它也适用于字符串数组。
问题是它只能以一种方式工作 - 创建的 appdomain 可以访问该数组,但只能只读。我想要的是将更新后的数组元素也返回到原始应用程序域中。我什至想用 List 和 Dictionary 对象来做到这一点。这可能吗?
using System;
namespace StackoverflowSample
{
class MyBoundaryObject : MarshalByRefObject
{
public void SomeMethod(AppDomainArgs ada)
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + "; executing");
ada.MyString = "working!";
ada.MyStringArray[0] = "working!";
string s = ada.MyStringArray[0]; // s is assigned value "a"!!!
}
}
public class AppDomainArgs : MarshalByRefObject
{
public string MyString { get; set; }
public string[] MyStringArray { get; set; }
}
static class Program
{
static void Main()
{
AppDomain domain = AppDomain.CreateDomain("Domain666");
MyBoundaryObject boundary = (MyBoundaryObject)
domain.CreateInstanceAndUnwrap(
typeof(MyBoundaryObject).Assembly.FullName,
typeof(MyBoundaryObject).FullName);
AppDomainArgs ada = new AppDomainArgs();
ada.MyString = "abc";
ada.MyStringArray = new string[] { "a", "b" };
Console.WriteLine("Before: " + ada.MyString + " " + ada.MyStringArray[0]);
boundary.SomeMethod(ada);
Console.WriteLine("After: " + ada.MyString + " " + ada.MyStringArray[0]);
Console.ReadKey();
AppDomain.Unload(domain);
}
}
}
不久前,我也有这个要求,将更新后的列表返回到主应用程序域,我使用创建一个解决方法解决了这个问题new instance of a List
and assign the desired values
。这应该对你有用 -
ada.MyStringArray = new string[] { "working!", "b" };
string s = ada.MyStringArray[0]; // s will be assigned value "working!"!!!
UPDATE
我想你必须clone
实例并实例化一个new instance
从远程方法返回之前。其原因working
为了简单string
is -
字符串是immutable
即每次用不同的值初始化它时,new instance
是在幕后为它创建的,有点像new String()
。因此,更新在其他 appDomain 中是可见的。
我尝试了这个小事StringBuilder
哪个是mutable
即,当您更改对象的内容时,不会为它们创建新实例。
public class AppDomainArgs : MarshalByRefObject
{
public StringBuilder MyStringBuilder { get; set; }
}
public void SomeMethod(AppDomainArgs ada)
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + "; executing");
ada.MyString = "working!";
ada.MyStringBuilder.Append(" working!");
}
现在,查看输出 -
Console.WriteLine("Before: " + ada.MyString + " " + ada.MyStringArray[0] + " " +
ada.MyStringBuilder);
boundary.SomeMethod(ada);
Console.WriteLine("After: " + ada.MyString + " " + ada.MyStringArray[0] + " "
ada.MyStringBuilder);
你会看到StringBuilder
对象不变。理想情况下,它的值应该是"a working!"
但其价值仍然是"a"
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)