PRB : Ne peut pas décharger des assemblys que vous créez et chargez à l'aide de script dans XSLT

Traductions disponibles Traductions disponibles
Numéro d'article: 316775 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F316775
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Cet article fait référence à Microsoft suivant.NET Framework Class Library espaces de noms :
  • System.IO
  • System.Xml
  • System.Xml.XPath
  • System.Xml.xsl
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous utilisez l'élément <msxsl:script> à plusieurs reprises avec System.Xml.Xslt framework, une fuite de mémoire peut se produire avec un volume élevé application Extensible Markup Language (XML) ou le langage XSL (Extensible Stylesheet). </msxsl:script>

Cause

Les classes de la System.Xml espace de noms prend en charge l'utilisation de scripts intégrés à l'aide de l'élément script dans les applications de Transformation XSL (XSLT). Par conséquent, l'élément <msxsl:script> permet de choisir le langage de programmation (tels que Microsoft Visual C#.NET ou Microsoft Visual Basic.(NET) pour effectuer certaines tâches.</msxsl:script>

Les fonctions déclarées sont contenues dans des blocs de script. Lorsque vous utilisez le script incorporé avec un fichier XSL, un assembly qui contient le langage MSIL (Microsoft Intermediate Language) est créé et chargé en mémoire. En raison d'une limitation de conception dans cette version de Microsoft.NET Framework, vous ne pouvez pas décharger cet assembly à partir de la mémoire. Cela peut entraîner une fuite de mémoire si les assemblys sont créés et chargés dans une boucle ou à plusieurs reprises.

Résolution

Pour résoudre ce problème, ne sont pas à plusieurs reprises chargés le XSLT avec le script. Développer votre application de manière à charger le XSLT qu'une seule fois et de le réutiliser autant de fois que nécessaire. Cette application pratique améliore également les performances.

Par exemple, le code suivant une fuite de mémoire :
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Modifiez le code comme suit pour charger le XSLT qu'une seule fois et le réutiliser dans une boucle :
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Ce code charge une fois l'assembly uniquement et ne dissipe pas de mémoire.

Contournement

Décharger un assembly individuel en déchargeant tous les domaines d'application contenant l'assembly. Pour ce faire, appelez le AppDomain.Unload() méthode pour chaque domaine d'application qui a l'assembly chargé, ou appelez le UnloadDomain() méthode sur l'API d'hébergement non managé.

Plus d'informations

Procédure pour reproduire le comportement

  1. Créer un Visual C#.Projet d'Application de Console NET.
  2. Créer une application XSLT et ajoutez le code suivant :
    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. Créez un fichier XSLT nommé XSLTFile1.xslt et ajoutez le code suivant :
     <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. Créer un fichier XML nommé XMLFile1.xml et ajoutez le code suivant :
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. Enregistrez les fichiers XML et XSL dans le dossier d'application.
  6. Parcourir le code. Notez que les assemblys sont créés et chargés dans la fenêtre de sortie de Visual Studio.NET.
  7. Ouvrez l'Analyseur de performances. Notez que les octets privés affichent l'augmentation en mémoire.

Propriétés

Numéro d'article: 316775 - Dernière mise à jour: lundi 24 février 2014 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
Mots-clés : 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 316775
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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