Недавно я начал использовать следующее исключение в моем unit test (NUnit) коде, когда EF пытается загрузить информацию из App.config:
System.Runtime.Serialization.SerializationException : Type is not resolved for member [my type name], [my assembly name]
Это происходит как с бегуном GUI NUnit, так и с R # VS-интегрированным бегуном. Вот быстрая unit test, которая воспроизводит проблему:
[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
{
}
Используя средство просмотра журнала слияния, я обнаружил, что сбой был результатом
FILE_NOT_FOUND HRESULT
ошибка. В принципе, похоже, что открытие конфигурации каким-то образом вызывает отправку объекта Foo назад к исходному (nunit runner) домену приложения, который затем пытается загрузить мою сборку и не может найти ее, потому что она не находится в папке bin. Фактически, я подтвердил, что копирование моей сборки в папку с бегункой NUnit - это еще один способ устранить проблему.
На данный момент кажется, что использование MarshalByRefObject
- лучший вариант. Тем не менее, я бы хотел здесь, если есть лучшие варианты и/или если кто-то может предложить подробное объяснение того, что происходит и почему. Есть ли недостатки в использовании MarshalByRefObject
здесь?
Это отличается от этого вопроса, потому что я уже определил MarshalByRefObject
как потенциальное решение и пытаюсь понять проблему более подробно/понять последствия of MarshalByRefObject
. Ответ на этот пост - это всего лишь выноска MarshalByRefObject
без дополнительной дополнительной информации.