Попытка создать класс, который может быть передан между доменами приложения как параметр c # - PullRequest
1 голос
/ 15 июня 2011

Вот что я пытаюсь сделать:

Я создал класс, который должен быть параметром, который будет передаваться между двумя доменами приложения. В файле 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 Ответ

3 голосов
/ 15 июня 2011

Поскольку созданный вами тип MyClass находится в сборке, которая еще не была загружена во втором домене приложений, рассмотрите возможность загрузки этой сборки непосредственно во второй домен приложений.

Ваш пример класса более сложен, чем должен быть, потому что вы не делаете ничего, что требует специального кода сериализации / десериализации. Это будет легче поддерживать:

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