重写WndProc时,Visual Studio设计器崩溃

时间:2014-10-22 05:44:16

标签: c# winforms

我有一个从System.Windows.Forms.Control继承的控件,它重写了WndProc函数以将消息传递给外部DLL。该函数看起来像

public class GraphicsPanel : Control
{
        bool designMode;
        EngineWrapper Engine;

        public GraphicsPanel()
        {
            designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
            this.SetStyle(ControlStyles.Selectable, true);
            this.TabStop = true;
        }

        public void SetEngine(EngineWrapper Engine)
        {
            this.Engine = Engine;
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if(designMode) // Tried this option
                return;

            if (!designMode && Engine != null) // And this option
                Engine.ProcessWindowMessage(m.Msg, m.WParam, m.LParam);
        }
}

如果我在此函数中提及Engine,它会崩溃,因为显示设计器时显然没有加载外部DLL。我收到错误消息“无法加载文件或程序集”...“或其中一个依赖项。

我当然应该补充一点,这段代码都在运行时工作,而不是设计时。每当我想使用设计器时,必须注释掉两个引擎代码行是很烦人的。

有关如何让设计人员在包含此行代码时正常工作的任何建议。

enter image description here

2 个答案:

答案 0 :(得分:2)

您是否需要在设计时执行WndProc? 如果没有,您可以尝试在if:

中添加条件
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
if (!designMode && Engine != null)
    ...

您需要导入System.ComponentModel名称空间。

Detecting design mode from a Control's constructor

答案 1 :(得分:0)

我通过将Engine引用移动到另一个函数来解决这个问题。这很奇怪,但确实有效。

    void PassMessage(Message m)
    {
        if (Engine != null)
            Engine.ProcessWindowMessage(m.Msg, m.WParam, m.LParam);
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (!designMode)
            PassMessage(m);
    }