我广泛使用XmlSerializer,而不是允许.NET在运行时生成必要的序列化程序集,我希望预先生成这些程序集并将它们与我的应用程序捆绑。我能够使用Sgen在构建时生成这些程序集。此外,我必须为每种我将序列化的数组类型单独运行Sgen(使用sgen /t:Foo[])。最后,我使用ILMerge将数组类型序列化类合并到Foo.XmlSerializers.dll程序集中。我已经通过ildasm验证了Foo.XmlSErializers.dll确实包含所有合并的类。
在运行时,.NET成功地从Foo.XmlSerializers.dll加载FooSerializer,而没有调用csc并生成临时程序集。然而,.NET无法从同一dll中加载ArrayOfFooSerializer,实际上会调用csc。
我如何才能成功地预先生成数组的序列化类型?
考虑以下两个程序集及其简化内容:
程序集:MyApp.exe
在运行时,.NET成功地从Foo.XmlSerializers.dll加载FooSerializer,而没有调用csc并生成临时程序集。然而,.NET无法从同一dll中加载ArrayOfFooSerializer,实际上会调用csc。
我如何才能成功地预先生成数组的序列化类型?
考虑以下两个程序集及其简化内容:
程序集: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 []”生成序列化程序。