2016-04-27 53 views
3

我有一個控制檯應用程序需要創建<T>類型的多個對象,並且T位於另一個我不擁有的dll中。如何處理第三方DLL中的資源?

創建類型爲T的對象時,它會在內存中加載XML,但不會釋放它。 因此,如果您創建T類型的對象太多,則會引發OutOfMemoryException。 該DLL不提供該對象的dispose方法,我無法直接與XML進行交互。

有沒有辦法處理由我不擁有的dll創建的某種類型的對象?

我使用.NET 4.6

第三方DLL是Trados Studio中的DLL,對誰知道這個程序的人。

+3

你可以加載它在不同的應用程序域嗎?聽起來像你需要提交一份錯誤報告。 –

+0

實際上,dll需要位於我的應用程序所在的文件夾中,否則我會從dll中獲得LicensingException。爲什麼在不同的appdomain中加載它可以解決問題? – Claudia

+1

您可以卸載應用程序域。您無法卸載直接引用。 –

回答

1

只需將第三部分對象的實例設置爲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