首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Sgen和ILMerge预生成ILMerge.阵列问题

使用Sgen和ILMerge预生成ILMerge.阵列问题
EN

Stack Overflow用户
提问于 2009-12-04 04:30:38
回答 2查看 2.8K关注 0票数 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

代码语言:javascript
复制
public class MyApp
{
    public static int Main(string[] args)
    {
        new XmlSerializer(typeof(Foo));
        new XmlSerializer(typeof(Foo[]));
    }
}

大会: Foo.dll

代码语言:javascript
复制
public class Foo
{

}

进一步信息:

以下app.config导致将与XmlSerialization相关的事件添加到事件日志

代码语言:javascript
复制
<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[]”重新生成序列化程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-04 19:07:03

您的问题可能实际上是因为您运行了ILMerge。您生成的序列化程序集跟踪它生成的程序集的确切版本,如果有任何差异(即使仅在代码中,而不是在接口中),则会说它已过期。事实证明,ILMerge更改了程序集ID,这可能是造成这种情况的原因。有关此问题的更多信息,请参阅此帖子。

票数 6
EN

Stack Overflow用户

发布于 2010-07-23 07:49:38

您可以尝试查看Mono中的sgen,它允许一次为多个类型生成序列化程序集。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1844870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档