【问题标题】:FileNotFoundException for mscorlib.XmlSerializers.DLL, which doesn't existmscorlib.XmlSerializers.DLL 的 FileNotFoundException,它不存在
【发布时间】:2010-09-05 22:38:16
【问题描述】:

我正在使用 XmlSerializer 反序列化 mscorelib.dll 中的特定类型

XmlSerializer ser = new XmlSerializer( typeof( [.Net type in System] ) );
return ([.Net type in System]) ser.Deserialize( new StringReader( xmlValue ) );

这会在程序集加载时抛出一个捕获的FileNotFoundException

"无法加载文件或程序集 'mscorlib.XmlSerializers, 版本=2.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089' 或 它的依赖项之一。系统 找不到指定的文件。”

融合日志:

=== Pre-bind state information ===
LOG: User = ###
LOG: DisplayName = mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
 (Fully-specified)
LOG: Appbase = file:///C:/localdir
LOG: Initial PrivatePath = NULL
Calling assembly : System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\localdir\bin\Debug\appname.vshost.exe.Config
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers/mscorlib.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers.EXE.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers/mscorlib.XmlSerializers.EXE.

据我所知,没有 mscorlib.XmlSerializers.DLL,我认为 DLL 名称是由 .Net 自动生成的,用于寻找序列化程序。

在编译以优化序列化时,您可以选择创建 myApplication.XmlSerializers.DLL,因此我认为这是框架对其进行检查的一部分。

问题在于,这似乎会导致加载应用程序出现延迟 - 此时它似乎会挂起几秒钟。

有什么办法可以避免或加快速度吗?

【问题讨论】:

  • 我正在处理的类型是RSAParameters,它被用作某些系统密码学的一部分。我现在已经通过另一种方式存储加密密钥并自己创建一个新的 RSAParameters 来解决这个问题。想要序列化(即加密/解密密钥)似乎是一件相对常见的事情。
  • 我在尝试运行测试工具 Ranorex 时遇到了这个问题。我现在有一个解决方法,但无法修复它,他们的支持人员尚未与我联系。 :-/
  • 检查生成的 mscorlib.XmlSerializers.dll 和您的项目的 .NET 版本。它必须相同。看看这个:stackoverflow.com/a/52848813/5639198
  • @Sashus 感谢您的帮助,但这个问题是十多年前的问题,我无法再访问有此问题的项目。

标签: c# .net serialization assemblies


【解决方案1】:

延迟是因为无法找到自定义序列化程序 dll,系统正在动态构建等效代码(这非常耗时)。

避免延迟的方法是让系统构建 DLL,并确保 .EXE 可以使用它 - 您尝试过吗?

【讨论】:

  • 感谢@Will Dean,这有点像我想的那样,但即便如此,它似乎也太慢了。如果是我自己的程序集创建序列化程序集应该不是问题,但我将如何为 mscorlib 做到这一点?
【解决方案2】:

好的,所以我遇到了这个问题,并找到了针对我所在地区的解决方案。

这是因为我试图将一个列表序列化为一个没有 XML 根属性的 XML 文档(文件)。添加以下文件后,错误就消失了。

XmlRootAttribute rootAttribute = new XmlRootAttribute();
rootAttribute.ElementName = "SomeRootName";
rootAttribute.IsNullable = true;

不知道它是否能解决你的问题,但它解决了我的问题。

【讨论】:

    【解决方案3】:

    我现在猜。但是:

    1. 系统可能正在为整个 mscorlib 生成序列化程序,这可能非常慢。
    2. 您可以通过将系统类型包装在您自己的类型中并对其进行序列化来避免这种情况 - 然后您将获得一个用于您自己的程序集的序列化程序。
    3. 您或许可以使用 sgen.exe 为 mscorlib 构建序列化程序,这是在将序列化程序 dll 集成到 VS 之前构建序列化程序 dll 的旧方法。

    【讨论】:

    • 再次感谢。我认为它是(1),但我不能做(2),因为它是一个结构。我会试试(3)
    • > 但我不能做(2),因为它是一个结构。我知道我在这里很模糊,但它是一个结构有什么问题 - 显然可能会有一些额外的复制,但相对于 xml 序列化的成本,这似乎不太重要。 system.xx 类型到底是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2018-09-22
    • 2020-04-02
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多