FileNotFoundException для mscorlib.XmlSerializers.DLL, который не существует

Я использую 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:localdirbinDebugappname.vshost.exe.Config
LOG: Using machine configuration file from c:WINDOWSMicrosoft.NETFrameworkv2.0.50727configmachine.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 имеет bee auto генерируется .Net ищет сериализатор.

У вас есть возможность создать myApplication.XmlSerializers.DLL при компиляции для оптимизации сериализации, поэтому я предполагаю, что это часть проверки платформы для него.

Проблема в том, что это, кажется, вызывает задержку в загрузке приложения — кажется, зависает на несколько секунд в этот момент.

Есть идеи, как этого избежать или ускорить?

3 ответа

  1. Задержка вызвана тем, что, будучи не в состоянии найти пользовательскую библиотеку DLL сериализатора, система строит эквивалентный код (который очень занимает много времени) на лету.

    Способ избежать задержки состоит в том, чтобы система построила DLL и убедилась, что она доступна .EXE-вы пробовали это?

  2. Теперь я догадываюсь. но:

    1. Система может генерировать сериализатор для всего mscorlib, который может быть очень медленным.
    2. Вы могли бы, вероятно, избежать этого, обернув системный тип в свой собственный тип и сериализуя его вместо этого — тогда вы бы получили сериализатор для своей собственной сборки.
    3. Можно создать сериализатор для mscorlib с помощью sgen.exe, который был старый способ построения библиотек DLL сериализатора, прежде чем он был интегрирован в VS.
  3. Хорошо, поэтому я столкнулся с этой проблемой и нашел решение для нее, специфическое для моей области.

    Это произошло потому, что я пытался сериализовать список в XML-документ (файл) без корневого атрибута XML. Как только я добавил следующие файлы, ошибка уходит.

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

    Не знаю, исправит ли это вашу проблему, но это исправило мою.