PRB: ไม่สามารถยกเลิกการโหลดแอสเซมบลีที่คุณสร้าง และโหลด โดยใช้สคริปต์ใน XSLT

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 316775 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
บทความนี้ถูกเก็บถาวรแล้วเนื้อหาของบทความจึงถูกนำเสนอ "ตามลักษณะที่เป็น" และจะไม่มีการปรับปรุงข้อมูลอีก
บทความนี้อ้างถึงเว็บไซต์ Microsoft ต่อไปนี้Namespaces ไลบรารีคลาสของ NET Framework:
  • System.IO
  • System.Xml
  • System.Xml.XPath
  • System.Xml.Xsl
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อคุณใช้องค์ประกอบ<msxsl:script>ซ้ำ ๆ กับ System.Xml.Xslt framework เป็นหน่วยความจำรั่วอาจเกิดขึ้นได้กับไดรฟ์ข้อมูลที่สูงแอพลิเคชัน Extensible Markup Language (XML) หรือภาษาสไตล์ชี Extensible (XSL) </msxsl:script>

สาเหตุ

ประเภทของสินค้า System.Xml namespace สนับสนุนการใช้สคริปต์ฝังตัวโดยใช้องค์ประกอบของสคริปต์ในแอปพลิเคชันการแปลง XSL (XSLT) ดังนั้น องค์ประกอบ<msxsl:script>ช่วยให้คุณสามารถเลือกภาษาการเขียนโปรแกรม (เช่น Microsoft Visual C#สุทธิหรือ Microsoft Visual Basicสุทธิ) เพื่อทำงานบางอย่าง</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. สร้างแบบ Visual C#การโครงการแอพลิเคชันของคอนโซลสุทธิ
  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. สร้างแฟ้ม XSLT ที่ชื่อ XSLTFile1.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. สร้างแฟ้ม XML ที่ชื่อว่า XMLFile1.xml จากนั้น ให้เพิ่มรหัสต่อไปนี้:
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. บันทึกแฟ้ม XML และ XSL ในโฟลเดอร์ของแอพลิเคชัน
  6. ขั้นตอนที่ผ่านรหัส ขอให้สังเกตว่า แอสเซมบลีที่ถูกสร้างขึ้น แล้วโหลดในหน้าต่างการแสดงผลของ Visual Studioสุทธิ
  7. เปิดตัวตรวจสอบประสิทธิภาพการทำงาน ขอให้สังเกตว่า ไบต์ที่ส่วนตัวแสดงการเพิ่มขึ้นของหน่วยความจำ

คุณสมบัติ

หมายเลขบทความ (Article ID): 316775 - รีวิวครั้งสุดท้าย: 24 กุมภาพันธ์ 2557 - Revision: 1.0
ใช้กับ
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
Keywords: 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้: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