我需要处理这个Image实例吗?

时间:2008-11-25 13:53:42

标签: .net dispose visualizer

我正在制作一个简单的Image Debugger Visualizer。代码如下。我不确定是否需要手动处理Image实例?因为我正在创建一个Windows窗体窗口和里面的PictureBox包含我的动态图像..我需要在窗体终止时添加一些特殊代码,处理这个?

这是代码..

using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.DebuggerVisualizers;
using DebuggerVisualizers;

[assembly: DebuggerVisualizer(
    typeof (ImageDebuggerVisualizer),
    typeof (VisualizerObjectSource),
    Target = typeof (Image),
    Description = "Image Visualizer")]

namespace DebuggerVisualizers
{
    public class ImageDebuggerVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            Image image = (Image) objectProvider.GetObject();
            Form form = new Form
                           {
                               Text = ("Image Visualizer - " + image.HorizontalResolution + " " + image.VerticalResolution),
                               Width = image.Width,
                               Height = image.Height
                           };

            PictureBox pictureBox = new PictureBox {Image = image, SizeMode = PictureBoxSizeMode.AutoSize};
            form.Controls.Add(pictureBox);
            form.ShowDialog();
        }
    }
}

感谢您的帮助:))

4 个答案:

答案 0 :(得分:2)

将Show方法更改为:

protected override void Show(IDialogVisualizerService windowService,
    IVisualizerObjectProvider objectProvider)        
{            
    Image image = (Image) objectProvider.GetObject();
    using (Form form = new Form())
    {            
        PictureBox pictureBox = new PictureBox();    
        pictureBox.Image = image;        
        form.Controls.Add(pictureBox); 
        form.ShowDialog();
    } 
}

using(){}块在关闭后会在窗体上调用Dispose,它也会处理窗体上的所有内容。

答案 1 :(得分:1)

图片框控件不处理图像,所以这取决于你,是的。

答案 2 :(得分:1)

嗯,我要在这里走出去,说你不应该把它丢弃。

我从未创建过可视化工具,但我并不完全知道Visual Studio会这样做,但在我看来,如果你在可视化工具中处理了一个对象,你可能会破坏你正在调试的代码。

这一切都归结为这一行:

Image image = (Image) objectProvider.GetObject();

如果该对象不是克隆,那么您将处置由正在调试的代码创建的对象。代码不会期望该对象突然被丢弃,并且S会击中风扇,导致您至少不得不重新启动调试。

我会安全地玩它而不是处理掉它。想一想 - 你正在调试。这不是一个漫长的过程。如果你确实泄漏了一个位图句柄,那它就不是世界末日......

答案 3 :(得分:0)

我认为你应该处理它。它应该很简单,只需在方法的第一行添加一个using()(在Image image = ...行周围),然后在form.ShowDialog()之后结束它。

我认为处理图像是安全的,因为如果要更改可视化对象,则必须调用TransferData / TranferObject / ReplaceDat / ReplaceObject方法之一将其发送回来。

相关问题