在设计器中打开表单时出现MissingMethodException;运行时工作正常

时间:2010-02-08 14:30:26

标签: c# forms designer missingmethodexception

假设我有一个具有此属性的A类的projoct A:

    public bool IsConnected
    {
        get { return m_isConnected; }
        private set { m_isConnected = value; }
    }

在同一个解决方案中,我有一个引用项目A的项目B,并且有一个名为 Login 的用户控件。此控件具有以下属性:

    private A m_A = null;

并在登录的构造函数中,我执行此调用:

  

if(m_A!= null&& m_A.IsConnected){       ......}

在同一个项目中,主窗体上有一个用窗体设计器添加的用户控件A.程序运行正常,正确读取此属性。

但是,在Designer中打开主窗体时,我得到了这个功能: MissingMethodException:'Boolean A.get_IsConnected()'

评论m_A.IsConnected让我使用设计师,但这变得非常烦人。有时似乎它随机起作用。

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

您可以使用:

而不是评论它
if (this.DesignMode)
{
    return;
}

if (!this.DesignMode)
{
    if (m_A != null && m_A.IsConnected) { ... }
}

编辑: 我记得曾经遇到过单身类问题。问题是单例总是被初始化,尽管从未调用过构造函数。如果我正确理解您的问题,您的问题也是如此。您的成员m_A永远不会为NULL,尽管它应该是。
我用以下方法处理了我的问题:
在Visual Studio中,转到“工具\选项... \调试\常规”并禁用“启用属性评估和其他隐式函数调用”并启用“跳过属性和运算符(仅限托管)”。
也许这有帮助。

答案 1 :(得分:0)

我过去曾被告知这个.DesignMode并不总是完全可靠。您可以使用的另一个选项是预处理程序指令:

#if DESIGN
return;
#else
if (m_A != null && m_A.IsConnected) { /* etc. */ }
#endif

然后添加一个名为DESIGN的条件编译符号,你应该是金色的。

答案 2 :(得分:0)

正如Ari Roth所说,DesignMode无法正常工作。为了弥补这一点,我使用了这种扩展方法:

public static bool IsDesignTime(this Control control)
{
    if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
    {
        return true;
    }

    if (control.Site != null && control.Site.DesignMode)
    {
        return true;
    }

    var parent = control.Parent;
    while (parent != null)
    {
        if (parent.Site != null && parent.Site.DesignMode)
        {
            return true;
        }
        parent = parent.Parent;
    }
    return false;
}

以与Simon Linder描述的方式相同的方式使用它。

答案 3 :(得分:0)

看起来设计师正在使用旧版本的控件DLL,它没有IsConnected属性。

MissingMethodException异常与m_A的值无关。 JIT编译器抱怨该属性丢失。如果在方法中将调用包装到m_A.IsConnected,则它可以工作,因为不调用此方法(因为m_A确实为null),因此不会被jitted,因此不需要IsConnected属性。

当你将控件放在VS中的一个表单中时,设计器在表单中创建一个控件的“真实”实例,它调用构造函数,这会导致JIT编译问题。