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

ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ

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. เปิดตัวตรวจสอบประสิทธิภาพการทำงาน ขอให้สังเกตว่า ไบต์ที่ส่วนตัวแสดงการเพิ่มขึ้นของหน่วยความจำ

คำเตือน: บทความนี้ได้รับการแปลโดยอัตโนมัติ

คุณสมบัติ

รหัสบทความ: 316775 - การตรวจสอบครั้งสุดท้าย: 02/24/2014 12:55:22 - ฉบับแก้ไข: 1.0

  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
  • kbnosurvey kbarchive kbprb kbmt KB316775 KbMtth
คำติชม