XmlSerializer 不使用 sgen 创建的 XmlSerializers.dll

2023-11-22

在我的 Visual Studio 2010 项目中,我使用以下 Post-Build 事件命令行来使用 sgen 创建 XmlSerializers.dll。

构建后事件:

"$(ProgramFiles)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sgen.exe" /a:"$(TargetPath)" /c:/keyfile:"c:\myproject\mykey.snk" /f

我的项目是强命名的,因此使用相同的密钥对“XmlSerializers.dll”进行强命名。 VS 在输出文件夹中创建 XmlSerializers.dll。

但是,我注意到使用 ProcessMonitor,.NET 仍然在运行时调用 CSC.exe。我遇到过这个post,其中用户遇到类似问题并通过使用 XmlSerializer(Type) 构造函数解决。

我在代码中使用了相同的技术,但它仍然调用 csc.exe:

var fs = new FileStream(SettingsFilePath, FileMode.Open);
try
{
var serializer = new XmlSerializer(typeof(AppSettings));
settings = (AppSettings)serializer.Deserialize(fs);
}
finally
{
fs.Close();
}

我需要使用预编译的 XML 序列化的原因是性能原因,而且我有时会在 Windows 关闭时看到 csc.exe 错误。我的应用程序在窗体关闭时保存数据,在关闭过程中,它会失败,因为 Windows 不允许在关闭过程中启动新进程。我看到过一些建议,可以通过预编译 XML 序列化来解决这个问题。

关于为什么 XmlSerializer 不使用 sgen 创建的 XmlSerializers.dll 有什么建议吗?

Thanks.


问题可能是不同的目标平台:默认情况下sgen使用“任何 CPU”(MSIL),如果包含要反序列化或序列化的类型的程序集是为 x86 o x64 编译的,则不会加载.XmlSerializers.dll

更一般地说,我查看了加载序列化程序集的 .NET 代码 - 以下是一些重现与单元测试相同行为的代码:

/// <summary>Generates an identifier for the assembly of a specified type</summary>
/// <remarks>Code copied from the .NET serialization classes - to emulate the same bahavior</remarks>
/// <param name="type">The type</param>
/// <returns>String identifying the type's assembly</returns>
static string GenerateAssemblyId(Type type) 
{ 
  Module[] modules = type.Assembly.GetModules();
  ArrayList list = new ArrayList();
  for (int i = 0; i < modules.Length; i++) {
    list.Add(modules[i].ModuleVersionId.ToString()); 
  }
  list.Sort(); 
  StringBuilder sb = new StringBuilder(); 
  for (int i = 0; i < list.Count; i++) {
    sb.Append(list[i].ToString()); 
    sb.Append(",");
  }
  return sb.ToString();
} // GenerateAssemblyId

/// <summary>Verifies that the serialization assembly for the specified type can be loaded</summary>
/// <remarks>Code copied from the .NET serialization classes - to emulate the same behavior and tests</remarks>
/// <param name="type">The type</param>
static void AssertCanLoadXmlSerializers(Type type)
{
  if (type == null)
    throw new ArgumentNullException("type");
  Assembly serializerAssembly = null;
  // Create the name of the XML serilizers assembly from the type's one
  AssemblyName name = type.Assembly.GetName(true); 
  name.Name = name.Name + ".XmlSerializers"; 
  name.CodeBase = null;
  name.CultureInfo = CultureInfo.InvariantCulture;
  try {
    serializerAssembly = Assembly.Load(name);
  } catch (Exception e) {
    Assert.Fail("Unable to load XML serialization assembly for type '{0}': {1}", type.FullName, e.Message);
  }
  object[] attrs = serializerAssembly.GetCustomAttributes(typeof(XmlSerializerVersionAttribute), false);
  if (attrs == null || attrs.Length == 0) {
    Assert.Fail(
      "Unable to use XML serialization assembly '{1}' for type '{0}': it does not contain XmlSerializerVersionAttribute", 
      type.FullName, 
      serializerAssembly.FullName
    );
  }
  if (attrs.Length > 1) {
    Assert.Fail(
      "Unable to use XML serialization assembly '{1}' for type '{0}': it contains multiple XmlSerializerVersionAttribute", 
      type.FullName, 
      serializerAssembly.FullName
    );
  }
  XmlSerializerVersionAttribute assemblyInfo = (XmlSerializerVersionAttribute)attrs[0];
  string assemblyId = GenerateAssemblyId(type);
  if (assemblyInfo.ParentAssemblyId != assemblyId) {
    Assert.Fail(
      "Unable to use XML serialization assembly '{1}' for type '{0}': it does not match assembly id '{2}'", 
      type.FullName, 
      serializerAssembly.FullName,
      assemblyId
    );
  }
} // AssertCanLoadXmlSerializers

只需致电AssertCanLoadXmlSerializers()传递需要序列化/反序列化的类型。如果序列化程序集未加载,您可以从错误消息中很好地了解原因。

我将其添加到我们的单元测试中,以便我可以合理地确定序列化程序集没问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XmlSerializer 不使用 sgen 创建的 XmlSerializers.dll 的相关文章

随机推荐

  • 使用 JavaScript 访问 iPhone 指南针

    知道是否可以使用 JavaScript 在 Safari 中访问 iPhone 指南针 我懂了如何访问 GPS 但我认不出指南针 On iOS 您可以检索compass像这样的值 window addEventListener device
  • 遍历目录树的方式有哪几种?

    如何用您最喜欢的语言遍历目录树 要在不同操作系统中遍历目录树 您需要了解什么 在不同的文件系统上 您最喜欢的帮助遍历目录树的库 模块是什么 In Python 如果您正在寻找快速 干净且便携的解决方案 请尝试 import os base
  • 将created_at和updated_at字段添加到mongoose模式

    有没有办法添加created at和updated at字段到猫鼬模式 而不必每次都将它们传递给新的MyModel 叫做 The created at字段将是一个日期 并且仅在创建文档时添加 这updated at字段将在任何时候更新为新日
  • 爪哇。比较字符串时忽略重音符号

    问题很简单 JAVA中有没有函数可以比较两个字符串并返回true 忽略重音字符 ie String x Joao String y Jo o 返回相等的 Thanks 我认为你应该使用Collator班级 它允许您设置强度和区域设置 并且它
  • 绝对/相对定位布局溢出

    在相当长的一段时间里 我一直在摆弄一个特定的布局问题 但我显然采用了错误的方式 以下是该方法的基本组成部分 div class stretched div class header SOME HEADER div div class som
  • 身份验证失败:Devise + OmniAuth + Twitter

    我正进入 状态 twitter Authentication failure invalid credentials OAuth Unauthorized 401 Unauthorized成功登录 Twitter 并且页面重定向到登录页面后
  • Hibernate Oracle 表空间注释

    我正在注释我的 DAO 并使用 hibernate3 hbm2ddl 生成 ddls 有没有办法注释表空间 不 没有办法开箱即用 我过去使用以下相当复杂的方法解决了这个问题 创建您自己的注释 TableSpec具有表空间和其他必要的属性 E
  • 复选框的 CSS 边框

    我正在应用 jQuery 复选框的样式 reg checkbox css border thin solid red 边框在 IE 中工作正常 但在 mozilla 中不行 如何使其兼容浏览器 使用大纲 http jsfiddle net
  • Visual Studio 组件缓存已过期

    几乎每次我尝试运行 EF 迁移的 update database 命令时 我都会在 Visual Studio 2015 中收到以下错误 使用 1 个参数调用 GetService 时发生异常 异常 使用 2 个参数调用 Invoke Vi
  • iOS Swift Flood 填充算法

    我为接触点的 桶填充 洪水填充 创建了这个扩展 extension UIImageView func bucketFill startPoint CGPoint newColor UIColor var newRed newGreen ne
  • 如何将模型从一个 Django 应用程序迁移到新的应用程序中?

    我有一个 Django 应用程序 里面有四个模型 我现在意识到这些模型之一应该位于单独的应用程序中 我确实安装了 South 用于迁移 但我不认为这是它可以自动处理的事情 如何将旧应用程序中的模型之一迁移到新应用程序中 另外 请记住 我需要
  • 当没有指定值时,是否应该跳过验证?

    我在 GlassFish 3 上使用 JSF2 我有一个接受可选电话号码的表格 我有这个自定义电话号码验证器 如下 并且我将该字段设置为 required false 因为电话号码在表单中是可选的 问题是 该领域的价值总是得到验证 当没有指
  • ASP.net 对根证书存储的权限

    是否可以授予 asp net 对证书存储的读取权限 如果是 怎么办 如果否 我是否需要为每个证书文件手动设置权限 如果是 这些文件在硬盘上的物理位置在哪里 一般来说 您授予权限A证书 我使用这样的方法来查找定制的证书并授予权限 如果您使用的
  • AngularJs 指令内的数据绑定

    我很难弄清楚如何确保在创建指令时维护双向数据绑定 这是我正在使用的东西和小提琴 http jsfiddle net dkrotts ksb3j 6 HTML
  • ASP.NET Core MVC,从数据库获取文件并渲染为图像

    我将图像数据存储在 SQL 表中 字段类型为varbinary 最大 我还存储图像内容类型 使用 Microsoft ASP NET Core MVC 和 Dapper 我尝试从数据库中获取文件并将其呈现为图像 这是我的文件模型 using
  • 如何使用base64设置图像源

    我想将图像源设置为 base64 源 但它不起作用 JSfiddle net NT9KB img src JavaScript document getElementById img src data image png base64 iV
  • 测试使用 Flask-WTF validate_on_submit 的 POST

    我很难测试 POST 以将类别添加到数据库 在该数据库中我使用 Flask WTF 进行验证和 CSRF 保护 对于CRUD操作请pm我的网站 我使用过 Flask Flask WTF 和 Flask SQLAlchemy 这是我的第一个独
  • 将数据从一个数据库传输到另一个数据库

    如何从一个数据库中取出数据并插入到另一个数据库表中 我不能这样做 请帮助我将数据从一个设备传输到另一个设备 有多种方法可以做到这一点 以下是两个选项 选项1 右键单击 要复制的数据库 选择 任务 gt 生成脚本 选择特定数据库对象 检查 表
  • 具有 Surface 输入的 MediaCodec:生成分块输出

    我正在尝试通过 CameraPreview 数据生成短的连续 mp4 文件MediaCodec createInputSurface 然而 重新创建MediaCodec与其关联的 Surface 需要停止相机以允许再次调用mCamera s
  • XmlSerializer 不使用 sgen 创建的 XmlSerializers.dll

    在我的 Visual Studio 2010 项目中 我使用以下 Post Build 事件命令行来使用 sgen 创建 XmlSerializers dll 构建后事件 ProgramFiles Microsoft SDKs Window