我有以下情况:
我正在使用第三方 .net 库,它调用非托管代码来做它需要的事情(.net 的东西只是一个瘦包装器)。该库具有各种 IDisposable 实现等,我将其包装在 usings 中,但它仍然像我想的那样泄漏内存,错误,筛子(我已经能够在单元测试中最终证明这一点)。
理想情况下,当然我会让第三方修复他们的图书馆,但他们没有响应,遗憾的是,我也不能放弃它,所以我目前正在做的是......
我使用这个第三方库所做的工作可以很容易地封装,所以在我需要它的地方,我启动一个带有几个命令行参数的进程并捕获标准输出。该过程完成它需要做的事情并通过简单地将结果对象序列化到标准输出来返回结果对象,然后启动该过程的启动应用程序中的方法反序列化结果对象并返回它,就好像没有发生任何奇怪的事情一样。
显然,这一切都很棘手(命令行参数解析、序列化等都增加了复杂性并减慢了速度)但它的优点是它非常简单并且可以工作(谢天谢地,您甚至可以使用 CreateNoWindow 关闭窗口,这样用户应用程序也没有注意到任何不愉快的事情)。
我想到的其他方法:
- 卸载应用程序池等等,但由于泄漏的内存是在.net 之外分配的,我认为这可能无济于事,还是会这样?
- 我还考虑过尝试卸载 DLL,但它看起来有点危险——我可以安全可靠地执行此操作吗?
所以,我的问题基本上归结为......
有没有办法让我保持一切都在进行中,并以某种方式清理这个第三方库的底部,这样我就不会泄漏内存?