2

我的项目使用类型化数据集来处理其数据。一些数据表中的某些列使用自定义程序集中的类型。当数据集被序列化时,它会像这样保存列和数据类型

<xs:element name="Mode" msdata:DataType="MyAssembly.Adapters.Mode, MyAssembly, Version=6.3.1.0, Culture=neutral, PublicKeyToken=dab9b4e6f12a95d2" type="xs:anyType" minOccurs="0" />

现在,当程序集 MyAssembly 更新时,此全名不再匹配,因此当程序重新运行并尝试反序列化 xml 时,会引发异常,指出它找不到版本 6.3.1.0 的程序集。

我尝试删除全名,如下所示,只保留类型,但这是不合法的。

<xs:element name="Mode" msdata:DataType="MyAssembly.Adapters.Mode" type="xs:anyType" minOccurs="0" />

有谁知道在使用更新的程序集类型时如何反序列化?

4

2 回答 2

2

几年后我不得不重新审视,我对这个解决方案不满意,并被提醒这看起来就像绑定重定向解决的问题。

将以下内容添加到主应用程序项目的配置文件中。它应该输出 app.exe.config。

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Assembly" publicKeyToken="token" culture="neutral" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

如果是 NUnit,则在 NUnit 项目中添加一个应用程序配置文件。它应该输出 Assembly.dll.config

现在不需要重写 XML。

于 2015-07-08T06:35:31.927 回答
0

我想出的解决方案是用最新的程序集版本号重写 xml。

在运行时,您可以找到您期望的程序集的版本号并进行正则表达式搜索和替换。

反序列化类型化数据集并引发异常的一个有趣注意事项是,您必须创建另一个新数据集以读取,因为在引发异常之前可能已经创建了表字段和关系。

IE

DataSet untypedds = new DataSet();
try {
    untypedds.ReadXml(xmlPath, XmlReadMode.ReadSchema);
}
catch (FileLoadException) {
    untypedds = new DataSet(); // Need the new DataSet here
    RewriteXml(xmlPath);
    untypedds.ReadXml(xmlPath, XmlReadMode.ReadSchema);
}
于 2012-12-18T03:48:11.380 回答