PRB: 無法卸載您建立和使用指令碼在 XSLT 中載入的組件

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:316775
本文已封存。本文係以「現狀」提供且不會再更新。
本文參照下列 Microsoft。NET Framework 類別庫的命名空間:
  • System.IO
  • 充分
  • System.Xml.XPath
  • System.Xml.Xsl
徵狀
當 System.Xml.Xslt 架構中重複使用的<msxsl:script>項目時,記憶體遺漏可能會發生大量的 「 可延伸標記語言 (XML) 或 「 可延伸樣式表語言 (XSL) 應用程式。</msxsl:script>
發生的原因
類別 充分 命名空間支援使用內嵌指令碼使用 XSL 轉換 (XSLT) 的應用程式中的指令碼項目。因此,<msxsl:script>項目可讓您選擇的程式語言 (例如 Microsoft Visual C#。NET 或 Microsoft Visual Basic。NET) 來執行特定工作。</msxsl:script>

宣告函式都包含在指令碼區塊內。當您使用內嵌的指令碼與 XSL 檔案時,內含 Microsoft 中繼語言 (MSIL) 的組件建立,並載入到記憶體中。因為的設計上的限制在這個版本的 Microsoft。NET Framework 中,您不能卸載記憶體中的組件。如果組件將被建立並載入重複或在迴圈中,這可能導致記憶體遺漏。
解決方案
若要解決這個問題,不會重複地載入與指令碼的 XSLT。開發一種您一次載入 XSLT,並視需要多次重複使用該應用程式。這種作法也可以改善效能。

例如,下列程式碼而流失記憶體:
For(int i=0;i<1000;i++){      xslt.Load(stylesheet);      //Do other stuff      xslt.Transform(doc, null, writer);}				
變更程式碼,如下所示,一次載入 XSLT,並在迴圈中重複使用它:
xslt.Load(stylesheet);For(int i=0;i<1000;i++){      //Do other stuff      xslt.Transform(doc, null, writer);}				
這個程式碼只會載入組件一次,並不遺漏記憶體。
其他可行方案
藉由卸載應用程式包含組件的所有應用程式定義域卸載個別組件。若要這樣做,請呼叫 AppDomain.Unload() 已載入,組件的每個應用程式定義域的方法或呼叫 UnloadDomain() 未受管理的裝載 API 中的方法。
其他相關資訊

若要重現這個問題的步驟

  1. 建立視覺化的 C#。NET 主控台應用程式專案。
  2. 建立的 XSLT 應用程式,然後加入下列程式碼:
    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. 建立名為 XSLTFile1.xslt,XSLT 檔,然後加入下列程式碼:
     <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. 建立名為 XMLFile1.xml,為 XML 檔案,然後加入下列程式碼:
    <?xml version='1.0'?><data>  <circle>    <radius>12</radius>  </circle>  <circle>    <radius>37.5</radius>  </circle></data>					
  5. 在應用程式資料夾中儲存的 XML 和 XSL 檔案。
  6. 逐步執行程式碼。請注意組件將被建立並載入 Visual Studio 的] 的 [輸出] 視窗中。NET。
  7. 開啟效能監視器。請注意私用位元組記憶體中顯示的增加。

警告:本文為自動翻譯

內容

文章識別碼:316775 - 最後檢閱時間:02/24/2014 15:40:36 - 修訂: 1.0

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

  • kbnosurvey kbarchive kbprb kbmt KB316775 KbMtzh
意見反應