PRB: 만들고 XSLT에서 스크립트를 사용 하 여 로드 된 어셈블리를 언로드할 수 없습니다.

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

이 문서의 영문 버전 보기:316775
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
이 문서는 다음 Microsoft를 나타냅니다.NET Framework 클래스 라이브러리 네임 스페이스:
  • System.IO
  • System.Xml
  • System.Xml.XPath
  • System.Xml.Xsl
현상
System.Xml.Xslt 프레임 워크와 <msxsl:script> 요소를 반복적으로 사용 대용량 확장 태그 언어 (XML) 또는 확장 가능한 스타일 시트 언어 (XSL) 응용 프로그램에서 메모리 누수가 발생할 수 있습니다.</msxsl:script>
원인
클래스는 System.Xml 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. Visual 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 [NULL]의 출력 창에 로드 됩니다.NET입니다.
  7. 성능 모니터를 엽니다. 전용 바이트 메모리 증가 표시 됩니다.

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 316775 - 마지막 검토: 02/24/2014 12:55:21 - 수정: 1.0

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

  • kbnosurvey kbarchive kbprb kbmt KB316775 KbMtko
피드백