PRB: Nelze uvolnit sestavení, které vytvoříte a načíst pomocí skriptu v XSLT

Překlady článku Překlady článku
ID článku: 316775 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Tento článek se týká následujících oborů názvů knihovny tříd Microsoft .NET Framework:
  • System.IO
  • System.XML
  • System.Xml.XPath
  • System.Xml.Xsl
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Při opakovaně použít prvek <msxsl:script> s System.Xml.Xslt framework může dojít nevracení paměti s vysokou svazku aplikaci XML (Extensible Markup Language) nebo Extensible Stylesheet Language (XSL).

Příčina

Třídy oboru názvů System.XML podporují použití vloženého skriptování pomocí prvku skript v aplikacích transformace XSL (XSLT). Prvek <msxsl:script> tedy umožňuje zvolit programovací jazyk (například Microsoft Visual C# .NET nebo Microsoft Visual Basic .NET) k provádění určitých úkolů.

Funkce deklarované jsou obsaženy v blocích skriptu. Při použití vloženého skriptu s soubor XSL sestavení, které obsahuje Microsoft zprostředkujících Language (MSIL) vytvořen a načten do paměti. Z důvodu omezení návrhu v této verzi Microsoft .NET Framework nemůže uvolnit z paměti, že sestavení. To může vést k nevracení paměti, pokud jsou vytvořeny a načten opakovaně nebo smyčku sestavení.

Řešení

Chcete-li tento problém vyřešit, opakovaně nenačtou XSLT pomocí skriptu. Vývoj aplikací takovým způsobem načíst XSLT jednou a znovu použít, kolikrát podle potřeby. Tento postup také zvyšuje výkon.

Například následující kód nevrací paměť:
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
změnit kód způsobem k načtení XSLT pouze jednou a znovu použít ve smyčce:
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
tento kód pouze načte sestavení jednou a není úniku paměti.

Jak potíže obejít

Uvolnit jednotlivé sestavení podle uvolnění všech doménách aplikací, které obsahují sestavení. To provedete volání metody AppDomain.Unload() pro každou doménu aplikace má načíst sestavení nebo volání metody UnloadDomain() na Nespravovaná hostitelských API.

Další informace

Kroky pro reprodukci tohoto chování

  1. Vytvořit projekt Visual C# .NET aplikace konzoly.
  2. Vytvoření aplikace XSLT a poté přidejte následující kód:
    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. Vytvořit soubor XSLT s názvem XSLTFile1.xslt a přidejte následující kód:
     <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. Vytvořit soubor XML s názvem XMLFile1.xml a přidejte následující kód:
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. Soubory XML a XSL uložit ve složce aplikace.
  6. Krokovat kód. Všimněte si, že sestavení vytvořen a načten v okně výstup Visual Studio .NET.
  7. Otevřít nástroj Sledování výkonu. Všimněte si soukromé bajty zobrazit zvětšení v paměti.

Vlastnosti

ID článku: 316775 - Poslední aktualizace: 28. února 2014 - Revize: 3.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework 1.0
Klíčová slova: 
kbnosurvey kbarchive kbmt kbprb KB316775 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:316775

Dejte nám zpětnou vazbu

 

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