PRB: 作成し、XSLT でスクリプトを使用してロードするアセンブリをアンロードできません。

文書翻訳 文書翻訳
文書番号: 316775
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
この資料には、次のマイクロソフトを指します。NET Framework クラス ライブラリの名前空間。
  • System.IO
  • System.Xml
  • System.Xml.XPath
  • System.Xml.Xsl
すべて展開する | すべて折りたたむ

目次

現象

<msxsl:script>要素を繰り返し System.Xml.Xslt フレームワークを使用すると、高ボリューム拡張マークアップ言語 (XML) や拡張スタイル シート言語 (XSL) のアプリケーションでメモリ リークが発生します。</msxsl:script>

原因

クラスは、 System.Xml 名前空間の XSL 変換 (XSLT) アプリケーションでは、script 要素を使用して、埋め込みスクリプトの使用をサポートしています。したがって、<msxsl:script>要素はプログラミング言語 (たとえば Microsoft Visual C#。 選択できます。NET または Microsoft Visual Basic。特定のタスクに設定します実行する NET)</msxsl:script>。

スクリプト ブロック内では宣言された関数が含まれています。XSL ファイルに埋め込まれたスクリプトを使用すると、Microsoft 中間言語 (MSIL) を含むアセンブリが作成され、メモリにロードします。このバージョンは、Microsoft のデザイン制限のため。NET Framework ではそのアセンブリをメモリからアンロードできません。アセンブリが作成され、繰り返しまたはループ内で読み込まれた場合に、メモリ リークが発生するがあります。

解決方法

この問題を解決するには、繰り返し、XSLT スクリプトは読み込まれません。XSLT を 1 回だけロードし、必要に応じて何回で再利用するようアプリケーションを作成します。この実習では、パフォーマンスも向上します。

たとえば、次のコードは、メモリ リークが発生します。
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
次のとおり XSLT を 1 回だけロードし、ループ内で再利用するためのコードを変更します。
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
このコードはのみ 1 回、アセンブリが読み込まれ、メモリ リークが発生しません。

回避策

アセンブリが含まれているすべてのアプリケーション ドメインをアンロードすることにより、個々 のアセンブリをアンロードします。これを行うには、呼び出しが 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 の [出力] ウィンドウに読み込まれたことを確認します。NET。
  7. パフォーマンス モニターを開きます。プライベート バイトの増加メモリ内で表示することに注意してください。

プロパティ

文書番号: 316775 - 最終更新日: 2014年2月24日 - リビジョン: 1.0
キーワード:?
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:316775
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

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