使用Sgen和ILMerge预生成XmlSerializers。阵列麻烦

时间:2009-12-04 04:30:39

标签: .net xml xml-serialization ilmerge sgen

我广泛使用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 []'。

2 个答案:

答案 0 :(得分:5)

您的问题可能实际上是由于您运行了ILMerge。您生成的序列化程序集跟踪生成它的程序集的完全版本,并且如果存在任何差异(即使仅在代码中,而不是在接口中),它将说它已过期。事实证明,ILMerge会更改程序集ID,这可能会导致此问题。 See this post for more information about the problem

答案 1 :(得分:3)

您可以尝试从Mono查看sgen,它允许同时为多种类型生成序列化程序集。