使用 Sgen 和 ILMerge 预生成 XmlSerializers。数组出现问题。

4
我广泛使用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
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个回答

6
你遇到的问题可能是因为你运行了ILMerge。你生成的序列化程序集会跟踪它所生成的程序集的精确版本,如果有任何区别(即使只是在代码中而不是接口中),它就会认为已过期。事实证明,ILMerge会更改程序集ID,这可能引起问题。关于此问题的更多信息请参见此文章。

3
你可以尝试使用Mono中的sgen,它允许同时为多个类型生成序列化程序集。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接