私は XmlSerializer を広範囲に使用しており、.NET が実行時に必要なシリアル化アセンブリを生成できるようにするのではなく、事前にこれらのアセンブリを生成してアプリケーションにバンドルしたいと考えています。Sgen を使用して、ビルド時にこれらのアセンブリを生成できます。さらに、シリアル化する配列の種類ごとに Sgen を個別に実行する必要があります (sgen /t:Foo[] を使用)。最後に、ILMerge を使用して、配列型のシリアル化クラスを Foo.XmlSerializers.dll アセンブリにマージします。Foo.XmlSErializers.dll に実際にマージされたすべてのクラスが含まれていることを ildasm で確認しました。
実行時に、.NET は、csc を呼び出して一時アセンブリを生成することなく、Foo.XmlSerializers.dll から FooSerializer を正常に読み込みます。ただし、.NET は同じ dll から ArrayOfFooSerializer をロードできず、実際には csc を呼び出します。
配列のシリアル化タイプを事前に生成するにはどうすればよいですか?
次の 2 つのアセンブリとその簡略化された内容を考えてみましょう。
アセンブリ: MyApp.exe
public class MyApp
{
public static int Main(string[] args)
{
new XmlSerializer(typeof(Foo));
new XmlSerializer(typeof(Foo[]));
}
}
アセンブリ: Foo.dll
public class Foo
{
}
詳細情報:
次の app.config により、XmlSerialization 関連のイベントがイベント ログに追加されます。
<configuration>
<system.diagnostics>
<switches>
<add name="XmlSerialization.PregenEventLog" value="1" />
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
</configuration>
Foo タイプのイベントはありません。Foo[] に対して次のメッセージが表示されます。
事前に生成されたシリアライザー 'Foo.XmlSerializers' の有効期限が切れました。「Foo[]」のシリアライザーを再生成する必要があります。