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:\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-имени есть bee auto, созданный .Net, который ищет сериализатор.
У вас есть возможность создать myApplication.XmlSerializers.DLL при компиляции для оптимизации сериализации, поэтому я предполагаю, что это часть проверки фреймворка.
Проблема заключается в том, что это, по-видимому, вызывает задержку при загрузке приложения - похоже, в течение нескольких секунд оно висит.
Любые идеи, как избежать этого или ускорить его?
Ответы
Ответ 1
Теперь я предполагаю. но:
- Система может генерировать сериализатор для всего mscorlib, который может быть очень медленным.
- Вероятно, вы могли бы избежать этого, вместо этого вместо этого нанесите тип системы в свой собственный тип и сериализуете - тогда вы получите сериализатор для своей собственной сборки.
- Возможно, вы сможете построить сериализатор для mscorlib с помощью sgen.exe, который был старым способом создания библиотек serializer, прежде чем он интегрировался в VS.
Ответ 2
Задержка заключается в том, что, будучи неспособным найти специальную dll dll, система строит эквивалентный код (который очень трудоемкий) на лету.
Чтобы избежать задержки, нужно создать систему для сборки DLL и убедиться, что она доступна для .EXE - вы пробовали это?
Ответ 3
Хорошо, поэтому я столкнулся с этой проблемой и нашел решение для нее, специфичное для моей области.
Это произошло потому, что я пытался сериализовать список в XML-документ (файл) без корневого атрибута XML. Когда я добавлю следующие файлы, ошибка исчезнет.
XmlRootAttribute rootAttribute = new XmlRootAttribute();
rootAttribute.ElementName = "SomeRootName";
rootAttribute.IsNullable = true;
Не знаю, удастся ли исправить вашу проблему, но она исправила мою проблему.