加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – 使用Sgen和ILMerge预生成XmlSerializers.阵列麻烦

发布时间:2020-12-16 23:01:57 所属栏目:百科 来源:网络整理
导读:我广泛使用XmlSerializer而不是允许.NET在运行时生成必要的序列化程序集,我想提前生成这些程序集并将它们与我的应用程序捆绑在一起.我能够使用Sgen在构建时生成这些程序集.另外,我必须为我将序列化的每个数组类型单独运行Sgen(使用sgen / t:Foo []).最后,我
我广泛使用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 []的以下消息:

Pre-generated serializer
‘Foo.XmlSerializers’ has expired. You
need to re-generate serializer for
‘Foo[]’.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读