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

기술 자료 번역 기술 자료 번역
기술 자료: 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. 성능 모니터를 엽니다. 전용 바이트 메모리 증가 표시 됩니다.

속성

기술 자료: 316775 - 마지막 검토: 2014년 2월 24일 월요일 - 수정: 1.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
키워드:?
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 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