prb: oluşturma ve komut dosyası xslt kullanarak yükleme derlemeleri kaldıramıyor

Makale çevirileri Makale çevirileri
Makale numarası: 316775 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Bu makalede, aşağıdaki Microsoft denilmektedir.net Framework sınıf kitaplığı ad:
  • System.IO
  • System.XML
  • System.XML.XPath
  • System.XML.xsl
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

<msxsl:script> Öğesini System.Xml.Xslt framework ile sürekli olarak kullandığınızda bellek sızıntısı yüksek hacimli Genişletilebilir Biçimlendirme Dili (Extensible Markup Language-xml) ya da Extensible Stylesheet Language (xsl) uygulama ile ortaya çıkabilir. </msxsl:script>

Neden

Sınıfları System.XML ad alanı xsl Dönüşümü (xslt) uygulamalarında komut dosyası öğesini kullanarak katıştırılmış komut dosyası kullanımını destekler. Bu nedenle, <msxsl:script> öğesi, programlama dili (Microsoft Visual C# gibi. seçmenize izin verirnet veya Microsoft Visual Basic.Belirli görevleri gerçekleştirmek için net)</msxsl:script>

Bildirilen İşlevler, komut dosyası blokları içinde yer alır. Bir xsl dosyası katıştırılmış komut dosyası kullandığınızda, Microsoft ara dili (MSIL) içeren derleme oluşturulur ve belleğe. Microsoft bu sürümünde tasarım sınırlamasından dolayı.net Framework, bellek, bu montaja kaldıramıyor. Derlemeler oluşturduysanız ve sürekli olarak veya bir döngü bu bellek sızıntısına neden olabilir.

Çözüm

Bu sorunu gidermek için sürekli olarak xslt ile komut dosyasını yüklemez. xslt bir kez yüklemek ve birçok kez olarak gerektiği gibi yeniden biçimde uygulamanızı geliştirin. Bu uygulama performansını da artırır.

Örneğin, aşağıdaki kod, bellek sızıntısına neden oluyor:
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Kod aşağıdaki gibi xslt yalnızca bir kez yükler ve döngü olarak yeniden değiştirin:
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Bu kod, yalnızca derleme bir kez yükler ve bellek sızıntısına neden değil.

Pratik Çözüm

Tek bir derlemenin derleme içeren tüm uygulama etki alanları kaldırarak kaldırın. Bunu yapmak için arama AppDomain.Unload() yüklenen derleme olan her uygulama etki alanı için yöntem veya çağrı UnloadDomain() Yönetilmeyen barındırma API yöntemi.

Daha fazla bilgi

Davranışı yeniden oluşturma adımları

  1. Görsel bir C# oluşturun.net Console Application proje.
  2. xslt uygulama oluşturun ve aşağıdaki kodu ekleyin:
    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 adlı bir xslt dosyası oluşturun ve aşağıdaki kodu ekleyin:
     <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 adlı bir xml dosyası oluşturun ve aşağıdaki kodu ekleyin:
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. xml ve xsl dosyaları, uygulama klasörüne kaydedin.
  6. Kod adım. Derlemeler oluşturulur ve Visual Studio çıktı penceresinde yüklenen dikkat edin.NET.
  7. Performans İzleyicisi'ni açın. Özel bayt belleği artırma görüntülemek dikkat edin.

Özellikler

Makale numarası: 316775 - Last Review: 24 Şubat 2014 Pazartesi - Gözden geçirme: 1.0
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
Anahtar Kelimeler: 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir: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