为什么XmlSerializer.Deserialize抛出System.IO.FileLoadException?

Rob*_*ney 6 c# xml-serialization

我遇到了令人困惑的XML反序列化问题.

我正在构建一个支持本地自定义其使用的各种服务的应用程序.我已经实现了一个抽象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();
}
Run Code Online (Sandbox Code Playgroud)

这很好用:我从应用程序配置文件中获取自定义功能程序集的路径,程序调用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));
}
Run Code Online (Sandbox Code Playgroud)

现在就是这样的.

我已经使用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
Run Code Online (Sandbox Code Playgroud)

我有点困惑为什么.该SetUp方法仍然运行,ServiceLocator.Default仍然返回一个类型的对象ClientServiceLocator,这意味着它已加载ClientCustomFeatures程序集.实际上,抛出异常的方法是在我被告知的程序集中无法加载.

什么是XmlSerializer想在这里做什么?为什么要加载已经加载的程序集?"无效指针"的含义是什么意思?最重要的是,我应该如何调试这样的东西?

Bra*_*ith 0

当一个程序集加载另一个本身具有(非 GAC)引用的程序集时,我遇到了程序集加载器(Fusion?)的问题。YourDLL.XmlSerializers.dll可能就是这样的一个集会。尝试关闭 Visual Studio 自动生成 XML 序列化程序集的选项(项目选项) - 这将删除附加程序集(以及对其的依赖项)。