如何避免SerializationException:在测试使用LogicalCallContext的组件时,不会为成员XXX解析类型

Cha*_*ion 30 c# configuration nunit entity-framework appdomain

当EF尝试从App.config加载信息时,我最近开始在我的单元测试(NUnit)代码中遇到以下异常:

System.Runtime.Serialization.SerializationException : Type is not resolved for member [my type name], [my assembly name]
Run Code Online (Sandbox Code Playgroud)

NUnit GUI运行器和R#的VS集成运行器都会发生这种情况.这是一个快速的单元测试,可以重现这个问题:

[Test]
public void Test()
{
    // adding 
    // ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    // here fixes things, probably because the configuration is cached

    CallContext.LogicalSetData("FooSlot", new Foo()); // removing this line fixes things
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // fails with above exception
}

[Serializable] // removing this gives a different exception complaining that Foo is not Serializable
public class Foo // : MarshalByRefObject // this fixes things
{ 
}
Run Code Online (Sandbox Code Playgroud)

使用融合日志查看器,我发现失败是由于

FILE_NOT_FOUND HRESULT

错误.基本上,似乎打开配置以某种方式导致Foo对象被发送回原始(nunit runner)app域,然后尝试加载我的程序集并且找不到它,因为它不在bin文件夹中.事实上,我确认将我的程序集复制到NUnit runner bin文件夹是另一种解决问题的方法.

在这一点上,似乎使用MarshalByRefObject是最好的选择.但是,如果有更好的选择和/或有人可以提供有关正在发生的事情和原因的详尽解释,我会喜欢这里.MarshalByRefObject在这里使用有什么缺点吗?

这与这个问题不同,因为我已经确定MarshalByRefObject了一个潜在的解决方案,并试图更深入地理解问题/理解其中的含义MarshalByRefObject.该帖子的答案只是一个标注MarshalByRefObject,没有任何有用的额外细节.

Ser*_*çin 5

我认为这是很好的解释,为什么会出现此错误。

是否可以在VS 2010的单元测试中使用逻辑调用上下文?

我搜索了什么是好的选择。除了MarshalByRefObject,我再也找不到任何答案。那么,为什么要继承它呢?这是一个很好的解释

价值元帅

对象仅在创建对象的应用程序域中有效。除非对象源自MarshalByRefObject或被标记为可序列化,否则任何将对象作为参数传递或作为结果返回的尝试都将失败。如果对象被标记为可序列化,则该对象将被自动序列化,从一个应用程序域传输到另一个应用程序域,然后反序列化以在第二个应用程序域中生成对象的精确副本。此过程通常被称为按价值调度。

这是来源。这对于了解对象序列化概念很有帮助

https://msdn.microsoft.com/zh-CN/library/ms973893.aspx

谢谢这个问题,我搜索并学到了好东西。