MyAssembly.XmlSerializers.dll 生成的目的是什么?

问题描述 投票:0回答:6

我正在开发一个生成程序集的项目。我刚刚注意到正在生成一个附加程序集 *.XmlSerializers.dll。为什么会自动生成这个文件以及它的用途是什么?

c# visual-studio-2008 xml-serialization
6个回答
107
投票

在 .NET 实现中,XmlSerializer 生成用于序列化/反序列化类的临时程序集(出于性能原因)。它可以即时生成(但每次执行都需要时间),也可以在编译期间预先生成并保存在您所询问的程序集中。

您可以在项目选项中更改此行为(分别是选项卡

Compile -> Advanced Compile Options -> Generate serialization assemblyAutoOn)。项目文件中对应的元素为GenerateSerializationAssemblies,例如<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>


61
投票
仅供参考。阻止自动生成 XmlSerializers.dll 的具体步骤是:

    在 VS 中,右键单击您的项目文件并选择“属性”
  1. 单击“构建”选项卡
  2. 将“生成序列化程序集”下拉列表从“自动”更改为“关闭”
  3. 重建它就会消失

6
投票
我认为这是出于性能原因对 XML 序列化器进行 JIT(即时)编译。

使用打开的 RegexOptions.Compiled 选项,您会得到与 RegEx 实例相同的结果。

我不是 .NET CLR 专家,很抱歉缺乏精确的技术细节。


5
投票

*.XmlSerializers.dll

 使用 Sgen.exe [XML Serializer Generator Tool] 生成 

请参阅 MSDN 上的

Sgen.exe

通常,

Sgen.exe

 用于项目的构建后事件。查看您的项目是否有生成后事件,该事件会生成 
*.XmlSerializers.dll

    


4
投票
该项目仅为Web应用程序生成project.XMLSerialisers.dll。对于其他应用程序,您必须单独运行 sgen。


0
投票
我只有在使用 xmlRootAttrebute 生成时才会有这个。

不确定您的用例,但我使用过:

private static string ChangeRootName(string xmlString, string newRootName) { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlString); // Create a new root element with the specified name XmlElement newRootElement = xmlDoc.CreateElement(newRootName); // Move all child nodes from the old root to the new root while (xmlDoc.DocumentElement.HasChildNodes) { newRootElement.AppendChild(xmlDoc.DocumentElement.FirstChild); } // Replace the old root with the new root xmlDoc.ReplaceChild(newRootElement, xmlDoc.DocumentElement); return xmlDoc.OuterXml; }
使用普通的 XmlSerialize 就不会出现此问题。

© www.soinside.com 2019 - 2024. All rights reserved.