PRB: Kann nicht Assemblys entladen, die Sie erstellen und mithilfe von XSLT-Skript laden

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 316775 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Dieser Artikel bezieht sich auf der folgenden Microsoft.NET Framework-Klassenbibliothek:
  • System.IO
  • System.Xml
  • System.Xml.XPath
  • System.Xml.xsl
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn Sie das <msxsl:script> -Element wiederholt mit System.Xml.Xslt Framework verwenden, kann ein Speicherverlust mit einem hohen Druckaufkommen Extensible Markup Language (XML) oder Extensible Stylesheet Language (XSL) Anwendung auftreten. </msxsl:script>

Ursache

Die Klassen von der System.Xml Namespace unterstützen die Verwendung von eingebettete Skripts mithilfe von Script-Element in der XSL-Transformation (XSLT)-Anwendungen. Deshalb können das <msxsl:script> -Element Sie auswählen, die Programmiersprache (z. B. Microsoft Visual C#.NET oder Microsoft Visual Basic.(NET) zum Durchführen bestimmter Aufgaben.</msxsl:script>

Deklarierte Funktionen sind in Skriptblöcke enthalten. Wenn Sie mit einer XSL-Datei eingebettete Skripts verwenden, wird eine Assembly, die Microsoft Intermediate Language (MSIL) erstellt und in den Speicher geladen. Aufgrund der Konstruktionsbeschränkungen in dieser Version von Microsoft.NET Framework kann nicht die Assembly aus dem Speicher entladen werden. Dies kann zu einem Speicherverlust führen, wenn Assemblys erstellt und wiederholt oder in einer Schleife geladen werden.

Lösung

Um dieses Problem zu beheben, laden Sie keine wiederholt die XSLT-Datei mit dem Skript. Entwickeln Sie Ihre Anwendung so, dass Sie einmal die XSLT-Datei zu laden und es so oft wiederverwenden wie erforderlich. Diese Praxis verbessert auch die Leistung.

Der folgende Code wird beispielsweise Speicherverlust generiert:
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Ändern Sie den Code wie folgt zu XSLT nur einmal geladen und in einer Schleife wiederzuverwenden:
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Dieser Code nur einmal die Assembly lädt und nicht Speicherverlust.

Abhilfe

Entladen alle Anwendungsdomänen, die die Assembly enthalten, um eine einzelne Assembly zu entladen. Rufen Sie hierzu die AppDomain.Unload() Methode für jede Anwendungsdomäne, die die Assembly geladen wurde, oder rufen Sie die UnloadDomain() Methode für die nicht verwaltete hosting-API.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen Sie ein Visual C#.NET-Konsolenanwendungsprojekt.
  2. Erstellen einer XSLT-Anwendung, und fügen Sie folgenden Code:
    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. Erstellen Sie eine XSLT-Datei mit dem Namen XSLTFile1.xslt, und fügen Sie folgenden Code:
     <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. Erstellen einer XML-Datei mit dem Namen XMLFile1.xml, und fügen Sie folgenden Code:
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. Speichern Sie die XML- und XSL-Dateien im Ordner Anwendung.
  6. Den Code schrittweise durchlaufen. Beachten Sie, dass die Assemblys erstellt und im Fenster Ausgabe von Visual Studio geladen werden.NET.
  7. Öffnen Sie Systemmonitor. Beachten Sie, dass die privaten Bytes den Anstieg im Speicher anzuzeigen.

Eigenschaften

Artikel-ID: 316775 - Geändert am: Montag, 24. Februar 2014 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
Keywords: 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 316775
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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