我遇到了一个让我感到困惑的XML反序列化问题。
我正在构建一个支持本地定制各种服务的应用程序。我实现了一个抽象的ServiceLocator类,它的方法返回各种对象。每个自定义安装都负责实现这个类的子类,并提供这些方法的实现。该类的核心代码如下:
这个很好用:我从应用程序配置文件中获取自定义功能程序集的路径,程序调用
其中之一的服务是
下面是
现在有一个问题。
我已经使用 NUnit 为此构建了单元测试。当我在练习客户端定制功能的测试夹具类中运行测试时,它们可以正常工作。但是,当我运行整个测试套件时,上述方法的最后一行会抛出以下异常:
我对此感到困惑。
我正在构建一个支持本地定制各种服务的应用程序。我实现了一个抽象的ServiceLocator类,它的方法返回各种对象。每个自定义安装都负责实现这个类的子类,并提供这些方法的实现。该类的核心代码如下:
public abstract class ServiceLocator
{
public static void Initialize(string customFeaturesPath)
{
Assembly a = Assembly.LoadFrom(customFeaturesPath);
Type t = a.GetExportedTypes()
.AsEnumerable()
.Where(x => x.IsSubclassOf(typeof (ServiceLocator)))
.First();
Default = (ServiceLocator)a.CreateInstance(t.FullName);
}
public static ServiceLocator Default { get; private set; }
public abstract DefaultValuesContainer CreateDefaultValuesContainer();
}
这个很好用:我从应用程序配置文件中获取自定义功能程序集的路径,程序调用
Initialize
,然后应用程序就可以调用ServiceLocator.Default
上的各种方法,并返回相应的服务定制实现。其中之一的服务是
DefaultValuesContainer
。这是一个简单的对象,公开需要在用户设置文件中持久化值的属性。我的想法是将此对象序列化为类型为string
的单个用户设置。它生成了一个您不希望手动编辑的用户设置文件,但我很满意。下面是
ServiceLocator.CreateDefaultValuesContainer
的具体实现:protected override DefaultValuesContainer CreateDefaultValuesContainer(string serializedXml)
{
DefaultValuesContainer c = new ClientDefaultValuesContainer();
if (string.IsNullOrEmpty(serializedXml))
{
return c;
}
XmlSerializer x = new XmlSerializer(c.GetType());
return (DefaultValuesContainer) x.Deserialize(new StringReader(serializedXml));
}
现在有一个问题。
我已经使用 NUnit 为此构建了单元测试。当我在练习客户端定制功能的测试夹具类中运行测试时,它们可以正常工作。但是,当我运行整个测试套件时,上述方法的最后一行会抛出以下异常:
System.InvalidOperationException : There is an error in XML document (0, 0).
----> System.IO.FileLoadException : Could not load file or assembly 'ClientCustomFeatures, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Invalid pointer (Exception from HRESULT: 0x80004003 (E_POINTER))
----> System.ArgumentNullException : Value cannot be null.
Parameter name: path1
我对此感到困惑。
SetUp
方法仍在运行,ServiceLocator.Default
仍返回一个类型为 ClientServiceLocator
的对象,这意味着它已加载了 ClientCustomFeatures
程序集。事实上,抛出异常的方法就在我被告知无法加载的程序集中。
XmlSerializer
在这里尝试做什么?为什么要尝试加载已经加载的程序集?“无效指针”是什么意思?最重要的是,我应该如何调试这样的问题?