处置在Windows窗体中创建的非托管资源

时间:2013-09-25 15:03:04

标签: vb.net winforms unmanaged

在Windows窗体设计器的.Designer.vb文件中创建对象时,是否会为每个对象自动生成Dispose()调用,还是必须手动完成?

具体来说,我有一个使用非托管资源的对象(通过调用ShowDialog(),需要调用在Windows窗体设计器中创建的Dispose())。我还需要在该对象上调用Dispose()吗?

注意:建议不要在同一个对象上多次调用Dispose()。

2 个答案:

答案 0 :(得分:1)

虽然我不知道答案,但是让我告诉你如何得到答案并学习设计winforms组件的巧妙技巧(可能适用于其他人但尚未尝试过)。

假设您有一个已经引用组件的项目,请创建一个新项目并将“启动外部程序”设置为“C:\ Program Files \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ devenv.exe”(更改此项)基于您的Visual Studio版本,这是从2005年开始的

运行此项目,然后运行另一个VS实例。您现在已在调试模式下打开VS.现在打开用于构建/测试组件的项目(来自VS的第二个实例),设置断点并测试它。您应该能够在配置代码中看到它达到您的断点。

这非常适合测试VS加载项和设计器组件。

答案 1 :(得分:0)

这是其中一个问题,答案是“因为这是它的工作方式”,但后来你意识到你实际上并不知道它是如何实现的。所以我花了一些时间来挖掘细节。

添加到Control集合中的任何Controls(按钮,文本框等)都会自动为您处理。这个实现从Control类本身一直继承。

添加到MyForm.Designer.vb文件中自动生成的components对象的任何非图形组件(例如Timer)也会为您处理。在这种情况下,components对象在实现System.ComponentModel.IContainer接口时,将是处理实际Dispose的System.ComponentModel.Container实例。