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.XmlSerializer, версия = 2.0.0.0, Culture = нейтральный, 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 при компиляции для оптимизации сериализации, поэтому я предполагаю, что это часть проверки фреймворка на это.

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

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

15.08.2008 11:03:30
Тип, с которым я имею дело RSAParameters, используется как часть системной криптографии. Я обошел это сейчас, сохранив зашифрованный ключ другим способом и сам создав новый RSAParameters. Кажется, что это довольно распространенная вещь для сериализации (то есть ключи шифрования / дешифрования).
Keith 15.08.2008 13:15:49
Я столкнулся с этой проблемой при попытке запустить инструмент тестирования Ranorex. У меня пока есть обходной путь, но я не смог это исправить, и их поддержка еще не связалась со мной. : - /
Dan Csharpster 24.10.2017 14:38:11
Проверьте .NET-версию сгенерированного mscorlib.XmlSerializers.dll и ваш проект. Должно быть так же. Проверьте это: stackoverflow.com/a/52848813/5639198
Sashus 17.10.2018 06:59:56
@Sashus Спасибо за помощь, но этот вопрос более десяти лет назад, у меня нет доступа к проекту, у которого больше не было этой проблемы.
Keith 18.10.2018 23:21:28
3 ОТВЕТА
РЕШЕНИЕ

Я догадываюсь сейчас. но:

  1. Система может генерировать сериализатор для всего mscorlib, который может быть очень медленным.
  2. Возможно, вы могли бы избежать этого, обернув системный тип своим собственным типом и сериализовав его вместо этого - тогда вы получите сериализатор для вашей собственной сборки.
  3. Возможно, вам удастся собрать сериализатор для mscorlib с помощью sgen.exe, который был старым способом создания dll-сериализатора до его интеграции в VS.
2
15.08.2008 11:44:33
Еще раз спасибо. Я думаю, что это (1), но я не могу сделать (2), поскольку это структура. Я попробую (3)
Keith 15.08.2008 11:49:35
> но я не могу сделать (2), поскольку это структура. Я знаю, что я здесь неясен, но в чем проблема с тем, что он является структурой - очевидно, может происходить дополнительное копирование, но относительно затрат на сериализацию xml кажется маловероятным, что это очень важно. Что такое тип system.xx?
Will Dean 15.08.2008 12:57:33

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

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

4
15.08.2008 11:06:41
Спасибо @Will Дин, это то, что я понял, но это кажется слишком медленным даже для этого. Если бы это была моя собственная сборка, создание сборки сериализации не было бы проблемой, но как бы я это сделал для mscorlib?
Keith 15.08.2008 11:10:10

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

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

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

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

4
30.03.2011 11:36:50