2016-04-27 56 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