FAQ 問題:Microsoft .NET Framework アプリケーションにて、リモート COM オブジェクトを明示的に解放する必要がある

ナレッジ番号:1718 | 登録日:2023/05/29 | 更新日:2023/08/31

【概要】
Microsoft .NET Framework 環境で ArcGIS Server アプリケーションを開発する際に、リモート COM オブジェクトのリソースを管理するため、いくつかのプログラミング パターンを実装する必要が生じることがあります。.NET 環境において COM オブジェクトの参照を解放するためには、一般的に以下 3 種類の方法が利用されています。

  1. IDisposable パターンを利用し、ESRI のクラスや WebObject  を using ブロック(C#)や try/catch ブロック(VB)内で使用してサーバ コンテキストを明示的に解放する
  2. アプリケーションの生存期間中、定期的にガベージ コレクションを実行する
  3. アプリケーション内で作成したすべての COM オブジェクト インスタンスに対して ManageLifetime() を呼び出す

上記のいずれも正常に動作させることができますが、相当量のコーディングが必要となり、またアプリケーションのパフォーマンスも低下させてしまいます。

ArcGIS Server のリソースを管理するための追加情報がこちらに示されています(英語): Managing ArcGIS Server Resources

【原因】
Microsoft .NET Framework 1.1 のガベージ コレクション メカニズムには不具合があり、リモート サーバにおける COM オブジェクト(DCOM)の作成と参照に影響します。 ArcGIS Server は DCOM 通信を使用しているため、この不具合は Microsoft .NET Framework における ArcGIS Server での全ての ArcObjects の使用に影響を及ぼします。 この不具合によって、DCOM サーバ上の COM オブジェクトがガベージ コレクションでは解放されないため、Marshal.ReleaseComObject() を使用して明示的に解放しない限り、DCOM サーバ上に COM オブジェクトが蓄積されます。DCOM サーバは、COM オブジェクトを保持しておくべきかどうか、クライアントに対し定期的に確認(ping)を行います。 解放されない COM オブジェクトの数が増加するに従ってping に要する時間も増大し、最終的には DCOM サーバを動作不能にしてしまう恐れがあります。

【解決方法】
以下の条件を満たしている場合、もしくはホットフィックス(Microsoft .NET-COM HotFix)が適用済みの場合は、リモート COM オブジェクトの明示的な解放は必須ではありません。

ホットフィックス情報の概要は以下の通りです:

  • Microsoft .NET Framework
    .NET Framework 1.1 では、ホットフィックスをインストールする前に、必ず Service Pack 1 をインストールしてください。
    .NET Framework 2.0 には、ホットフィックスが含まれています。
    ArcGIS Server for the Microsoft .NET Framework(9.1)を動作させるマシンには、.NET Framework 1.1 の Service Pack 1 とホットフィックスをインストールしてください。

  • オペレーティング システム
    Windows 2000 、Windows XP(サービスパックなし)、Windows XP SP1、Windows 2003 (サービスパックなし) 環境では、必ずこのホットフィックスをインストールしてください。Windows 2003 Server SP1 と Windows XP SP2 環境ではこのホットフィックスは含まれています。
    ArcGIS Server - Server Object Container process(ArcSOC.exe)を動作させるマシンには、それぞれのオペレーティング システムに対応したホットフィックスをインストールしてください。

関連情報:
[FIX] COM + コンポーネントと共通言語ランタイムを使用する .NET Framework 1. 1 アプリケーション実行すると、段階的なシステムのパフォーマンス低下が発生します。
ESRI Article ID : 30609

メタデータ

カテゴリ

製品