我广泛使用 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”已过期。你
需要重新生成序列化器
'富[]'。
您的问题实际上可能是由于您运行了 ILMerge。您生成的序列化程序集跟踪exact生成它的程序集的版本,如果有任何差异(即使仅在代码中,而不是在界面中),则会说它已过期。事实证明,ILMerge 更改了程序集 ID,这可能是导致此问题的原因。有关该问题的更多信息,请参阅这篇文章 http://blog.bits-in-motion.com/2009/11/xmlserializers-moduleversionid-ilmerge.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)