Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

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

Ancien nº de publication de cet article : F316775
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
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
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.

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 316775 - Dernière mise à jour : 02/24/2014 12:55:21 - Révision : 1.0

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

  • kbnosurvey kbarchive kbprb kbmt KB316775 KbMtfr
Commentaires