尝试创建可以在应用程序域之间作为参数 c# 传递的类
Posted
技术标签:
【中文标题】尝试创建可以在应用程序域之间作为参数 c# 传递的类【英文标题】:Trying to create class that can be passed between app domains as parameter c# 【发布时间】:2011-06-15 18:03:00 【问题描述】:这就是我想要做的:
我创建了我想作为参数的类,该参数将在两个应用程序域之间传递。在文件 ClassLibrary1.dll 中:
[Serializable]
public class MyClass
public string mystr = "NotWorking!";
public MyClass(string _mystr)
mystr = _mystr;
public override string ToString()
return mystr;
然后我创建了另一个类,它将接收 MyClass 作为 otherdomainclass.dll 中的参数:
public class OtherDomainClass : MarshalByRefObject, IOtherDomainClass
#region Implementation of IOtherDomainClass
private MyClass my;
public MyClass getParam()
return my;
public void setParam(MyClass _param)
my = _param;
#endregion
并在 iotherdomainclass.dll 中为该类定义接口:
public interface IOtherDomainClass
MyClass getParam();
void setParam(MyClass _param);
现在我正在尝试运行以下测试:
[TestMethod()]
public void PassMyclassBetweenDomains()
domain = AppDomain.CreateDomain(appDomainName);
otherClass = domain.CreateInstanceFromAndUnwrap(location, "OtherDomain.OtherDomainClass") as IOtherDomainClass;
Assert.IsNotNull(otherClass);
otherClass.setParam(new MyClass("Working!"));
string sparam = otherClass.getParam().ToString();
Assert.AreEqual(sparam, "Working!");
AppDomain.Unload(domain);
测试失败并出现以下错误:
Test method SerizalizableDataTypesTest.ParamCollectionTest.PassMyclassBetweenDomains threw exception
System.Runtime.Serialization.SerializationException: Unable to find assembly 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
对不起,我不知道我做错了什么部分。或者如果所有代码从一开始就错了,请你帮我重新创建它。
非常感谢!!!
【问题讨论】:
请添加完整的异常和堆栈跟踪。 在控制台应用程序中运行场景时发现了一个有趣的问题,但是当我在单元测试中运行时,它会抛出我写的异常。 你使用什么单元测试框架?你能发布完整的异常和堆栈跟踪吗? 【参考方案1】:由于您创建的 MyClass
类型位于尚未加载到第二个 AppDomain 中的程序集中,请考虑将该程序集直接加载到第二个 AppDomain 中。
您的示例类比它需要的更复杂,因为您没有做任何需要自定义序列化/反序列化代码的事情。这将更容易维护:
[Serializable]
public class MyClass
public string mystr = "NotWorking!";
public MyClass(string _mystr)
mystr = _mystr;
public override string ToString()
return mystr;
【讨论】:
现在在模块窗口中检查它我可以看到ClassLibrary1.dll的两个apperiences。会不会是你能想到的其他原因?谢谢 如有疑问,请相信例外情况。似乎应该加载它,但是确定会伤害什么?具体查看版本和公钥令牌。 foreach(appDomain2.GetAssemblies() 中的 var 程序集) Console.WriteLine (a); // 可能是您针对不同版本的 ClassLibrary1 dll 编译了应用程序。 好的,我想我们离问题越来越近了。您的 foreach 引发异常:无法加载文件或程序集 'OtherDomainClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到文件 你能让 foreach 汇编代码在第二个 AppDomain 中运行吗?您还可以打印出 assembly.Location。这将告诉您程序集在磁盘上的位置。 运行它我得到的输出是:ClassLibrary1.dll 已加载以上是关于尝试创建可以在应用程序域之间作为参数 c# 传递的类的主要内容,如果未能解决你的问题,请参考以下文章