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を書き直すことでした。

実行時に、期待しているアセンブリのバージョン番号を見つけて、正規表現の検索と置換を行うことができます。

型指定されたデータセットを逆シリアル化して例外がスローされる場合の興味深い注意点は、例外が発生する前にテーブルフィールドと関係がすでに作成されている可能性があるため、読み込む別の新しいデータセットを作成する必要があることです。

つまり

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 に答える