【问题标题】:Dispose unmanaged resources created in Windows Form释放在 Windows 窗体中创建的非托管资源
【发布时间】:2013-10-01 06:09:08
【问题描述】:

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

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

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

【问题讨论】:

  • 相当模糊。 Winforms 会自动处理在设计时放置在表单上的组件和控件。

标签: vb.net winforms unmanaged


【解决方案1】:

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

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

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

这非常适合测试 VS 插件和设计器组件。

【讨论】:

    【解决方案2】:

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

    任何添加到Controls 集合的Control(按钮、文本框等)都会自动为您处置。这个实现是从Control 类本身继承而来的。

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

    【讨论】:

    • 您能提供文档的链接吗?谢谢。
    • 我使用了一个名为 Reflector 的工具来反编译代码并查看 Dispose 的确切处理位置。
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多