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

Traduções de Artigos Traduções de Artigos
Artigo: 316775 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Este artigo refere-se a Microsoft a seguir.NET Framework Class Library namespaces:
  • System. IO
  • System. XML
  • System.XML.XPath
  • System.XML.xsl
Expandir tudo | Reduzir tudo

Nesta página

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ção

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.

Propriedades

Artigo: 316775 - Última revisão: 24 de fevereiro de 2014 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
Palavras-chave: 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtpt
Tradução automática
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 316775

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com