尝试创建可以在应用程序域之间作为参数 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# 传递的类的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 在表单之间传递数据的最佳方式

作用域与闭包

将冗长的字符串(作为参数)传递到控制台应用程序

C#:将枚举类型作为参数传递

在c#中将引用数组作为参数传递[重复]

C# 再次理解委托事件与函数作为参数