我有一个从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。我收到错误消息“无法加载文件或程序集”...“或其中一个依赖项。
我当然应该补充一点,这段代码都在运行时工作,而不是设计时。每当我想使用设计器时,必须注释掉两个引擎代码行是很烦人的。
有关如何让设计人员在包含此行代码时正常工作的任何建议。
答案 0 :(得分:2)
您是否需要在设计时执行WndProc? 如果没有,您可以尝试在if:
中添加条件bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
if (!designMode && Engine != null)
...
您需要导入System.ComponentModel名称空间。
答案 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);
}