Сведения о вопросе

Martincow

03:47, 6th August, 2020

Теги

c#   .net   serialization   assemblies    

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

Просмотров: 537   Ответов: 3

Я использую XmlSerializer для десериализации определенного типа в mscorelib.dll

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

Это выбрасывает пойманный FileNotFoundException , когда загружается assembly:

"Не удалось загрузить файл или assembly '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, я думаю, что имя DLL было автоматически сгенерировано .Net, ищущим сериализатор.

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

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

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



  Сведения об ответе

lesha

06:05, 22nd August, 2020

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

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


  Сведения об ответе

lool

14:28, 9th August, 2020

Итак, я столкнулся с этой проблемой и нашел решение для нее, специфичное для моей области.

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

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

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


  Сведения об ответе

+-*/

07:19, 12th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться