sgen の出力を csc 7.10.6001.4 でコンパイルする

.NET Framework 2.0 の sgen の出力を .NET 1.1 の cscコンパイルしちゃいましょう。*1
まずは sgen を /keep で実行し、ソースコードを得ます。そのままではコンパイルできません。
sgen の出力するアセンブリには4つのクラスが含まれていて、

  • XmlSerializationWriterXXX
  • XmlSerializationReaderXXX
  • XXXSerializer
  • XmlSerializerContract

となっています。*2 このうち XmlSerializerContract は今回は除いておくことにします。

alias の削除

まず、最初に気が付くのはネームスペースが global:: で修飾されているので、これを排除する必要があるということ。

XmlSerializerContract の削除

XmlSerializerContract の親クラス XmlSerializerImplementation が存在しないので、とりあえずこのクラスには消えてもらいます。

XmlSerializationWriter のメソッドの変更

いくつかのメソッドの引数が変更になっているのを修正します。たとえば、WriteStartElement は、

.NET 1.1: void WriteStartElement(string name, string ns, object o, bool writePrefixed)
.NET 2.0: void WriteStartElement(string name, string ns, object o, bool writePrefixed, XmlSerializerNamespaces xmlns)

となっているため、最後の xmlns を削除するなどが必要になります。
(ここまでの修正で XmlSerializationWriterXXX を使用してシリアライズ可能になりました)

XmlSerializationReader のメソッド変更

XmlSerializationWriter 同様に XmlSerializationReader も修正を行います。たとえば、

.NET 1.1: void UnknownNode(object o)
.NET 2.0: void UnknownNode(object o, string qnames)

なんて違いがあります。ReaderCount 関連は checkDeserializerAdvance を持たない .NET 1.1 では無用なので削除しても問題ないでしょう。

*1:あれ、でも VS2005 も VS2003 も古い .NET Framework 用のアセンブリ出力オプションがあるから csc で古いバージョンを指定してコンパイルできるのかな???

*2:XXXは対象のオブジェクト名など