FileNotFoundException para mscorlib.XmlSerializers.DLL, que não existe
-
08-06-2019 - |
Pergunta
Estou usando um XmlSerializer para desserializar um tipo específico em mscorelib.dll
XmlSerializer ser = new XmlSerializer( typeof( [.Net type in System] ) );
return ([.Net type in System]) ser.Deserialize( new StringReader( xmlValue ) );
Isso lança um pego FileNotFoundException
quando a montagem é carregada:
"Não foi possível carregar arquivo ou montagem 'mscorlib.xmlSerializers, versão = 2.0.0.0, cultura = neutro, publicKeyToken = B77A5C561934E089' ou uma de suas dependências.O sistema não pode encontrar o arquivo especificado."
Log de fusão:
=== 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.
Pelo que eu sei, não existe mscorlib.XmlSerializers.DLL, acho que o nome da DLL foi gerado automaticamente pelo .Net procurando o serializador.
Você tem a opção de criar um myApplication.XmlSerializers.DLL ao compilar para otimizar serializações, então presumo que isso faça parte da verificação da estrutura.
O problema é que isso parece estar causando um atraso no carregamento do aplicativo – ele parece travar por alguns segundos neste momento.
Alguma idéia de como evitar isso ou acelerar?
Solução
Eu estou supondo agora. mas:
- O sistema pode estar gerando um serializador para o conjunto da mscorlib, que poderia ser muito lento.
- Você provavelmente poderia evitar este envolvendo o tipo de sistema em seu próprio tipo e serializadas que em vez -. Então você deseja obter um serializador para o seu próprio assembly
- Você pode ser capaz de construir o serializador para mscorlib com sgen.exe, que era a velha maneira de construir dlls serializador antes que ficasse integrada no VS.
Outras dicas
O atraso é porque, tendo sido incapaz de encontrar a dll serializador personalizado, o sistema está construindo o código equivalente (que é muito demorado) na mosca.
A maneira de evitar o atraso é ter o sistema de compilação do DLL, e verifique se ele está disponível para o .EXE? - Você já tentou isso
Ok, então eu corri para este problema e ter encontrado uma solução para ele específico para a minha área.
Isso ocorreu porque eu estava tentando serializar uma lista em um documento XML (arquivo) sem um atributo XML de raiz. Uma vez eu adicionei os seguintes arquivos, o erro desaparece.
XmlRootAttribute rootAttribute = new XmlRootAttribute();
rootAttribute.ElementName = "SomeRootName";
rootAttribute.IsNullable = true;
Não sei se ele vai resolver o seu problema, mas fixo o meu.