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?

Foi útil?

Solução

Eu estou supondo agora. mas:

  1. O sistema pode estar gerando um serializador para o conjunto da mscorlib, que poderia ser muito lento.
  2. 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
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top