尝试创建可以在app域之间传递的类作为参数c#

时间:2011-06-15 18:03:00

标签: c# serialization appdomain

这就是我想要做的事情:

我创建了一个类,我想成为将在两个应用程序域之间传递的参数。在文件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 个答案:

答案 0 :(得分:3)

由于您创建的MyClass类型位于第二个AppDomain中尚未加载的程序集中,请考虑直接在第二个AppDomain中加载该程序集。

您的示例类比它需要的更复杂,因为您没有做任何需要自定义序列化/反序列化代码的事情。这将更容易维护:

[Serializable]
public class MyClass
{
   public string mystr = "NotWorking!";
   public MyClass(string _mystr)
   {
      mystr = _mystr;
   }
   public override string ToString()
   {
      return mystr;
   }
}