2016-04-27 12 views
3

<T>Tの複数のオブジェクトを作成する必要があるコンソールアプリケーションが、私が所有していない別のDLLの中にあります。サードパーティのDLLにリソースを処分する方法は?

タイプTのオブジェクトを作成すると、メモリにXMLがロードされますが、解放されることはありません。 したがって、タイプがTのオブジェクトを非常に多く作成すると、OutOfMemoryExceptionがスローされます。 dllはそのオブジェクトに対してdisposeメソッドを提供せず、XMLと直接対話できません。

私が所有していないDLLによって作成された特定のタイプのオブジェクトを処分する方法はありますか?

私は、サードパーティのDLLがプログラムを知っている人のために、TRADOSメーカーのDLLです.NET 4.6

を使用しています。

+3

別のappdomainで読み込むことはできますか?バグレポートをファイルに付ける必要があるようです。 –

+0

実際には、dllは私のアプリケーションと同じフォルダになければなりません。それ以外の場合はdllからLicensingExceptionを取得します。別のappdomainに読み込むのがなぜ問題を解決するのでしょうか? – Claudia

+1

あなたはアプリドメインをアンロードできます。直接参照をアンロードすることはできません。 –

答えて

1

3番目の部分オブジェクトのインスタンスをnullに設定し、新しいインスタンスを作成するだけです。ガベージコレクタは最終的にnullに設定したオブジェクトを最終的にクリーンアップし、もうメモリ不足の例外が発生することはありません。

public class Class1 
{ 
    private StringBuilder sb = new StringBuilder(); 

    public void loadFile() 
    { 
     using(StreamReader sr = new StreamReader("C:\\test.txt")) // Loads large text file. 
     { 
      sb.Append(sr.ReadToEnd()); 
     } 
    } 
} 

static void Main() 
{ 
    fileloader.Class1 inst = new fileloader.Class1(); // Assume this is the instance of your 3rd party object. 

    do 
    { 
     if(inst == null) 
     { 
      inst = new fileloader.Class1(); 
     } 

     for (int i = 0; i < 100; i++) 
     { 
      inst.loadFile(); 
     } 

     inst = null; // allows the object to be GC'ed. Without this i get the OutOfMemoryException 

     Thread.Sleep(1000); 

    } while (true); 
} 
+0

それは私のために動作しません、メモリはまだ増加しています。 – Claudia

+0

@Claudiaメモリは増加しますが、ガベージコレクタは失敗の原因にならないようにします。 GCは、必要と判断したときにのみ実行されます。私が使用していたメモリを投稿した私のサンプルプログラムでは、300〜600MBの間でバウンスしました。あなたは失敗を再現しようとすることができますか?失敗するのにどれくらい時間がかかりますか? – CathalMF

+0

900回の操作を実行すると失敗します。 – Claudia