gpt4 book ai didi

.net - 使用 Sgen 和 ILMerge 预生成 XmlSerializers。数组的问题

转载 作者:数据小太阳 更新时间:2023-10-29 02:02:40 27 4
gpt4 key购买 nike

我广泛使用 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 .

关于.net - 使用 Sgen 和 ILMerge 预生成 XmlSerializers。数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1844870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com