问题 mscorlib.XmlSerializers.DLL的FileNotFoundException,它不存在


我正在使用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'或   其中一个依赖项。系统   找不到指定的文件。“

FusionLog:

=== 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,我认为.Net的自动生成的DLL名称正在寻找序列化程序。

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

问题是,这似乎导致加载应用程序的延迟 - 此时似乎挂起了几秒钟。

任何想法如何避免或加快它?


5749
2017-08-15 11:03


起源

我正在处理的类型是 RSAParameters 这是一些系统加密的东西。我现在通过另一种方式存储加密密钥并自己创建一个新的RSAParameters来解决这个问题。想要序列化(即加密/解密密钥)似乎是相对常见的事情。 - Keith
我在尝试运行测试工具Ranorex时遇到了这个问题。我现在有一个解决方法,但无法修复它,他们的支持还没有联系我。 : - / - Dan Csharpster


答案:


我现在在猜。但:

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

2
2017-08-15 11:44



再次感谢。我认为它是(1),但我不能做(2),因为它是一个结构。我会试试(3) - Keith
>但我不能做(2)因为它是一个结构。我知道我在这里很暗淡,但它是一个结构的问题是什么 - 显然可能会有一些额外的复制,但相对于xml序列化的成本,它似乎不太可能是非常重要的。什么是system.xx类型呢? - Will Dean


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

避免延迟的方法是让系统构建DLL,并确保它可用于.EXE - 你试过这个吗?


4
2017-08-15 11:06



谢谢@Will Dean,这就像我想的那样,但即便如此,它似乎太慢了。如果它是我自己的程序集创建序列化程序集不应该是一个问题,但我如何为mscorlib做到这一点? - Keith


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

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

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

Dunno如果它能解决你的问题,但它确定了我的问题。


4
2018-06-04 23:10