PRB: Impossibile scaricare gli assembly che consente di creare e caricare tramite script in XSLT

Traduzione articoli Traduzione articoli
Identificativo articolo: 316775 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato archiviato. L?articolo, quindi, viene offerto ?così come è? e non verrà più aggiornato.
In questo articolo si riferisce la seguente documentazione Microsoft.NET Framework Class Library gli spazi dei nomi:
  • System. IO
  • System. Xml
  • System.Xml.XPath
  • System.Xml.xsl
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando si utilizza l'elemento <msxsl:script> ripetutamente con framework di System.Xml.Xslt, può verificarsi una perdita di memoria con un elevato volume applicazione Extensible Markup Language (XML) o Extensible Stylesheet Language (XSL). </msxsl:script>

Cause

Le classi dei System. Xml spazio dei nomi supportano l'utilizzo di script incorporati utilizzando l'elemento script nelle applicazioni di trasformazione XSL (XSLT). Pertanto, l'elemento <msxsl:script> consente di scegliere il linguaggio di programmazione (ad esempio Microsoft Visual C#.NET o Microsoft Visual Basic.NET) per eseguire determinate attività.</msxsl:script>

Le funzioni dichiarate sono contenute all'interno di blocchi di script. Quando si utilizzano script incorporato con un file XSL, un assembly che contiene Microsoft Intermediate Language (MSIL) viene creato e caricato in memoria. A causa di una limitazione in questa versione di Microsoft.NET Framework, è possibile scaricare tale assieme dalla memoria. Ciò potrebbe causare una perdita di memoria se gli assembly vengono creati e caricati in un ciclo o ripetutamente.

Risoluzione

Per risolvere il problema, non ripetutamente caricare XSLT con lo script. Sviluppare l'applicazione in modo caricare una sola volta il XSLT e riutilizzare il numero di volte necessario. Questa pratica migliora inoltre le prestazioni.

Il codice seguente, ad esempio, delle perdite di memoria:
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Modificare il codice come segue per caricare il file XSLT una sola volta e riutilizzarlo in un ciclo:
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Questo codice solo carica l'assembly in una sola volta e non si verifichino perdite di memoria.

Workaround

Scaricare un singolo assembly caricando tutti i domini applicazione che contengono l'assembly. A tale scopo, chiamare il AppDomain.Unload() metodo per ciascun dominio applicazione contenente l'assembly caricato o chiamata di UnloadDomain() metodo API di hosting non gestito.

Informazioni

Procedura per riprodurre il comportamento

  1. Creare un Visual C#.Progetto di applicazione Console di NET.
  2. Creare un'applicazione di XSLT e quindi aggiungere il seguente codice:
    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. Creare un file XSLT denominato XSLTFile1.xslt e quindi aggiungere il seguente codice:
     <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. Creare un file XML denominato Xmlfile1 e quindi aggiungere il seguente codice:
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. Salvare i file XML e XSL nella cartella dell'applicazione.
  6. Eseguire il codice. Si noti che gli assembly vengono creati e caricati nella finestra di Output di Visual Studio.NET.
  7. Aprire Performance Monitor. Si noti che i byte privati l'aumento in memoria.

Proprietà

Identificativo articolo: 316775 - Ultima modifica: lunedì 24 febbraio 2014 - Revisione: 1.0
Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
Chiavi: 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 316775
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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