我的项目使用类型化数据集来处理其数据。一些数据表中的某些列使用自定义程序集中的类型。序列化数据集时,它会保存列和数据类型,如此
<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" />
有没有人知道在使用更新的程序集类型时如何反序列化?
答案 0 :(得分:1)
此后我不得不重新考虑这个问题,我对此解决方案感到不满意,并提醒我这看起来就像binding redirection解决的问题一样。
将以下内容添加到主应用程序项目的配置文件中。它应该输出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。
答案 1 :(得分:0)
我想出的解决方案是使用最新的程序集版本号重写xml。
在运行时,您可以找到您期望的程序集的版本号,并进行正则表达式搜索和替换。
使用反序列化类型化数据集和引发异常的一个有趣的注意事项是,您必须创建另一个要读取的新数据集,因为在引发异常之前可能已经创建了表字段和关系。
即
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);
}