ant*_*ony 4 .net xml ilmerge sgen xml-serialization
我广泛使用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.
如何成功预生成阵列的序列化类型?
考虑以下2个程序集及其简化内容:
汇编:MyApp.exe
public class MyApp
{
public static int Main(string[] args)
{
new XmlSerializer(typeof(Foo));
new XmlSerializer(typeof(Foo[]));
}
}
Run Code Online (Sandbox Code Playgroud)
汇编:Foo.dll
public class Foo
{
}
Run Code Online (Sandbox Code Playgroud)
更多信息:
以下app.config导致将与XmlSerialization相关的事件添加到事件日志中
<configuration>
<system.diagnostics>
<switches>
<add name="XmlSerialization.PregenEventLog" value="1" />
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我看不到Foo类型的事件.我看到Foo []的以下消息:
预生成的序列化程序'Foo.XmlSerializers'已过期.您需要为'Foo []'重新生成序列化程序.
您的问题实际上可能是因为您运行了ILMerge.您生成的序列化程序集跟踪它生成的程序集的确切版本,并且如果存在任何差异(即使仅在代码中,而不是接口),它将说它已过期.事实证明,ILMerge会更改程序集ID,这可能会导致此问题. 有关该问题的详细信息,请参阅此帖子.