PRB: Não é possível descarregar módulos (assemblies) que você criar e carrega usando o script em XSLT

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 316775
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Este artigo refere-se a Microsoft a seguir.NET Framework Class Library namespaces:
  • System. IO
  • System. XML
  • System.XML.XPath
  • System.XML.xsl
Sintomas
Quando você usa o elemento <msxsl:script> repetidamente com a estrutura de System.Xml.Xslt, um vazamento de memória pode ocorrer com um alto volume de aplicativo de linguagem de marcação extensível (XML) ou Extensible Stylesheet Language (XSL).</msxsl:script>
Causa
As classes da System. XML namespace suporta o uso de script incorporado usando o elemento script em aplicativos de transformação em XSL (XSLT). Portanto, o elemento <msxsl:script> permite que você escolha a linguagem de programação (como Microsoft Visual C#.NET ou do Microsoft Visual Basic.NET) para executar determinadas tarefas.</msxsl:script>

Funções declaradas estão contidas dentro de blocos de script. Quando você usa o script incorporado com um arquivo XSL, um assembly que contém o Microsoft Intermediate Language (MSIL) é criado e carregado na memória. Por causa de uma limitação de design nesta versão do Microsoft.NET Framework, você não pode descarregar o assembly da memória. Isso pode levar a um vazamento de memória, se os assemblies são criados e carregados repetidamente ou em um loop.
Resolução
Para resolver esse problema, não repetidamente carregue o XSLT com o script. Desenvolva seu aplicativo de tal forma que você carregar o XSLT de uma vez e reutilizá-la quantas vezes forem necessárias. Essa prática também melhora o desempenho.

Por exemplo, o código a seguir vazamentos de memória:
For(int i=0;i<1000;i++){      xslt.Load(stylesheet);      //Do other stuff      xslt.Transform(doc, null, writer);}				
Altere o código da seguinte forma para carregar o XSLT apenas uma vez e reutilizá-lo em um loop:
xslt.Load(stylesheet);For(int i=0;i<1000;i++){      //Do other stuff      xslt.Transform(doc, null, writer);}				
Esse código apenas carrega o assembly de uma vez e não vazam memória.
Como Contornar
Descarrega uma montagem individual por descarregar todos os domínios de aplicativo que contêm o assembly. Para fazer isso, chame o AppDomain.Unload() método para cada domínio de aplicativo que tenha o assembly carregado, ou ligue para o UnloadDomain() método de API de hospedagem não gerenciado.
Mais Informações

Passos para reproduzir o comportamento

  1. Crie um Visual C#.Projeto de aplicativo de Console do NET.
  2. Criar um aplicativo do XSLT e, em seguida, adicione o seguinte código:
    using System;using System.IO;using System.Xml;using System.Xml.XPath;using System.Xml.Xsl;public class Sample{	private const String filename = "..\\..\\XmlFile1.xml";	private const String stylesheet = "..\\..\\XSLTFile1.xslt";	public static void Main() 	{                for(int i=0;i<1000;i++)                {		XslTransform xslt = new XslTransform();                xslt.Load(stylesheet);		//Load the XML data file.		XPathDocument doc = new XPathDocument(filename);		//Create an XmlTextWriter to write to the console.         		XmlTextWriter writer = new XmlTextWriter(Console.Out);		writer.Formatting = Formatting.Indented;		//Transform the file.		xslt.Transform(doc, null, writer);		writer.Close();                }		System.Console.Read();        	} }					
  3. Crie um arquivo XSLT chamado XSLTFile1.xslt e, em seguida, adicione o seguinte código:
     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    xmlns:msxsl="urn:schemas-microsoft-com:xslt"    xmlns:user="urn:my-scripts">  <msxsl:script language="C#" implements-prefix="user"><![CDATA[     public double circumference(double radius){       double pi = 3.14;       double circ = pi*radius*2;       return circ;     }                  ]] >     <!-- Remove the space between ]] and > in the preceding line. --><!-- The space is inserted because of a publishing constraint. -->   </msxsl:script>  <xsl:template match="data">    <circles>  <xsl:for-each select="circle">    <circle>    <xsl:copy-of select="node()"/>       <circumference>          <xsl:value-of select="user:circumference(radius)"/>               </circumference>    </circle>  </xsl:for-each>  </circles>  </xsl:template></xsl:stylesheet>					
  4. Crie um arquivo XML denominado XMLFile1. XML e, em seguida, adicione o seguinte código:
    <?xml version='1.0'?><data>  <circle>    <radius>12</radius>  </circle>  <circle>    <radius>37.5</radius>  </circle></data>					
  5. Salve os arquivos XML e XSL na pasta do aplicativo.
  6. Percorra o código. Observe que os assemblies são criados e carregados na janela de saída de Visual Studio.NET.
  7. Abra o Monitor de desempenho. Observe que os bytes particulares exibem o aumento na memória.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 316775 - Última Revisão: 02/24/2014 20:26:17 - Revisão: 1.0

Microsoft .NET Framework 4.0, Microsoft .NET Framework 2.0, Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbprb kbmt KB316775 KbMtpt
Comentários
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)