Проблема: Не удается выгрузить сборки, создаваемым и загрузить с помощью сценариев XSLT

Переводы статьи Переводы статьи
Код статьи: 316775 - Vizualiza?i produsele pentru care se aplic? acest articol.
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Данная статья ссылается на следующие пространства имен библиотеки классов Microsoft .NET Framework::
  • System.IO
  • System.Xml
  • System.Xml.XPath
  • System.Xml.Xsl
Развернуть все | Свернуть все

В этой статье

Проблема

При использовании <msxsl:script>элемент несколько раз с System.Xml.Xslt платформы, может произойти утечка памяти с большим объемом XML- или расширяемого языка стилей (XSL) приложения.</msxsl:script>

Причина

КлассыSystem.Xmlпространство имен поддерживает использование внедренных сценариев с помощью элемента сценария в приложениях преобразования XSL (XSLT). Таким образом, <msxsl:script>элемент можно выбрать язык программирования (таких как Microsoft Visual C# .NET или Microsoft Visual Basic .NET) для выполнения определенных задач.</msxsl:script>

Функции, объявленной содержатся внутри блоков сценариев. При использовании внедренных сценариев с XSL-файла, сборки, содержащей промежуточного языка Майкрософт (MSIL) создаются и загружаются в память. Из-за ограничения в данной версии Microsoft .NET Framework не удается выгрузить эту сборку из памяти. Это может привести к утечке памяти, если сборки создаются и загружаются повторно или в цикле.

Решение

To resolve this problem, do not repeatedly load the XSLT with the script. Develop your application in such a way that you load the XSLT once and reuse it as many times as needed. This practice also improves performance.

For example, the following code leaks memory:
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Change the code as follows to load XSLT only once and reuse it in a loop:
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
This code only loads the assembly once and does not leak memory.

Временное решение

Unload an individual assembly by unloading all the application domains that contain the assembly. To do this, call theAppDomain.Unload()method for each application domain that has the assembly loaded, or call theUnloadDomain()method on the unmanaged hosting API.

Дополнительная информация

Действия по воспроизведению поведения

  1. Create a Visual C# .NET Console Application project.
  2. Create an XSLT application, and then add the following 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. Create an XSLT file that is named XSLTFile1.xslt, and then add the following 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. Create an XML file named XMLFile1.xml, and then add the following code:
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. Save the XML and XSL files in the application folder.
  6. Step through the code. Notice that the assemblies are created and loaded in the Output window of Visual Studio .NET.
  7. Open Performance Monitor. Notice that the private bytes display the increase in memory.

Свойства

Код статьи: 316775 - Последний отзыв: 21 февраля 2014 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 1.0
Ключевые слова: 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:316775

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