我正在开展一个大型项目,我的任务之一就是消除可能的内存泄漏。在我的代码中,我注意到几个IDisposable项目没有被处理,并已修复。但是,这引出了一个更基本的问题,如何在我的项目中找到实现IDisposable的所有使用类? (不是自定义创建的类,而是已使用的标准库类)。 我已经找到了一个实现IDisposable的不太明显的类(DataTable实现了MarshalByValueComponent,它继承了IDisposable)。现在,我使用MSDN手动检查任何可疑的类,但是我没有某种方法可以自动执行此过程吗?
答案 0 :(得分:18)
Reflector可以显示哪些类实现了IDisposable
:只需在Reflector中找到IDisposable
接口,然后展开“派生类型”节点
代码中的另一个选项是扫描所有已加载的程序集以查找实现IDisposable
的类型:
var disposableTypes =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(IDisposable).IsAssignableFrom(t)
select t;
答案 1 :(得分:7)
使用FxCop测试您的项目。它可以捕获未放置IDisposable对象的所有位置。您可能需要做一些工作来禁用所有不相关的FxCop规则,只留下与IDisposable相关的规则。
例如,这是FxCop IDisposable规则之一:http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx
注意:您需要找到自己的.NET和第三方IDisposable对象,这些对象无法正确处理。
答案 2 :(得分:3)
答案 3 :(得分:0)
我觉得下面的代码可能有用。如果从外部工具运行,则必须调整以加载正确的装配。
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
if(type.GetInterface(typeof(IDisposable).FullName) != null)
{
// Store the list somewhere
}
}
答案 4 :(得分:0)
尝试这个LINQ查询:
var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
select t;