Я использую XmlSerializer для десериализации определенного типа в mscorelib.dll
XmlSerializer ser = new XmlSerializer( typeof( [.Net type in System] ) );
return ([.Net type in System]) ser.Deserialize( new StringReader( xmlValue ) );
Это вызывает пойманный FileNotFoundException, когда сборка загружена:
"Could not load file or assembly 'mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified."
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 при компиляции для оптимизации сериализации, поэтому я предполагаю, что это часть проверки инфраструктуры.
Проблема в том, что это, похоже, вызывает задержку загрузки приложения - в этот момент кажется, что оно зависает на несколько секунд.
Есть идеи, как этого избежать или ускорить?
Я столкнулся с этой проблемой при попытке запустить инструмент тестирования Ranorex. На данный момент у меня есть обходной путь, но я не смог его исправить, и их служба поддержки еще не связалась со мной. : - /
Проверьте версию .NET созданного файла mscorlib.XmlSerializers.dll и свой проект. Должно быть так же. Проверьте это: stackoverflow.com/a/52848813/5639198
@Sashus Спасибо за помощь, но этот вопрос возник более десяти лет назад, у меня больше нет доступа к проекту, в котором возникла эта проблема.





Задержка связана с тем, что, поскольку система не смогла найти DLL-библиотеку пользовательского сериализатора, она создает эквивалентный код (что отнимает очень много времени) на лету.
Чтобы избежать задержки, попросите систему создать DLL и убедиться, что она доступна для .EXE - вы пробовали это?
Спасибо, @Will Dean, я вроде как подумал, но даже для этого это кажется слишком медленным. Если бы это была моя собственная сборка, создающая сборку сериализации, не было бы проблем, но как бы я сделал это для mscorlib?
Я сейчас догадываюсь. но:
Еще раз спасибо. Я думаю, что это (1), но я не могу сделать (2), поскольку это структура. Я попробую (3)
> но я не могу сделать (2), так как это структура. Я знаю, что я здесь тупой, но в чем проблема, что это структура - очевидно, может происходить дополнительное копирование, но относительно затрат на сериализацию xml кажется маловероятным, что это очень важно. В любом случае, что это за тип system.xx?
Хорошо, я столкнулся с этой проблемой и нашел решение для моей области.
Это произошло потому, что я пытался сериализовать список в XML-документ (файл) без корневого атрибута XML. Как только я добавил следующие файлы, ошибка исчезнет.
XmlRootAttribute rootAttribute = new XmlRootAttribute();
rootAttribute.ElementName = "SomeRootName";
rootAttribute.IsNullable = true;
Не знаю, решит ли это вашу проблему, но она устранила мою.
Я имею дело с типом
RSAParameters, который используется как часть системной криптографии. Я обошел это сейчас, сохранив зашифрованный ключ другим способом и самостоятельно создав новый RSAParameters. Похоже, что сериализовать (например, ключи шифрования / дешифрования) - довольно обычное дело.