我广泛使用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[]));
}
}
程序集: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 []'。
答案 0 :(得分:5)
您的问题可能实际上是由于您运行了ILMerge。您生成的序列化程序集跟踪生成它的程序集的完全版本,并且如果存在任何差异(即使仅在代码中,而不是在接口中),它将说它已过期。事实证明,ILMerge会更改程序集ID,这可能会导致此问题。 See this post for more information about the problem
答案 1 :(得分:3)
您可以尝试从Mono查看sgen,它允许同时为多种类型生成序列化程序集。