2010-02-08 4 views
4

Скажем, у меня есть projoct А с классом А, обладающий этим свойством:MissingMethodException при открытии формы в дизайнере; во время выполнения работ в порядке

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

В том же решении, у меня есть проект B, который ссылается на проект A и имеет пользователю контроль Войти. Этот элемент управления имеет этот атрибут:

private A m_A = null; 

и в застройщик из Логин я сделать этот призыв:

если (! M_a = нуль & & m_A.IsConnected) { ...}

В этом же проекте основное form имеет на нем пользовательский элемент управления A, который был добавлен разработчиком формы. Программа работает нормально, и это свойство правильно читается.

Однако при открытии основной формы в конструкторе я получаю эту execption: MissingMethodException: «Boolean A.get_IsConnected()»

Комментирование m_A.IsConnected давайте мне использовать конструктор, но это становится довольно раздражает. И иногда кажется, что это случайным образом просто работает.

Любые идеи?

+0

Weird вещь, я только что узнал, что упаковка m_A.IsConnected в метод удаляет исключение (m_a = нуль всегда терпит неудачу в CTOR!): частный BOOL GetIsConnected() {вернуться m_A.IsConnected; } –

ответ

0

Мне говорили в прошлом, что this.DesignMode не всегда отлично надежен. Другой вариант, вы можете использовать это директива препроцессора:

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

Затем добавьте условный символ компиляции под названием DESIGN, и вы должны быть золотистым цветом.

+0

Я хотел бы исправить проблему в ее источнике, но пока я об этом обходлюсь. Благодаря! –

0

Вместо того, чтобы комментировать его можно использовать:

if (this.DesignMode) 
{ 
    return; 
} 

или

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

Edit: Я помню, имеющих проблемы с классом одноэлементных один раз. Проблема заключалась в том, что синглтон всегда инициализировался, хотя конструктор никогда не назывался. Если я правильно понимаю вашу проблему, ваша проблема аналогична. Ваш член m_A никогда не будет NULL, хотя это должно быть.
У меня была проблема со следующим:
В Visual Studio перейдите в «Инструменты \ Параметры ... \ Отладка \ Общие» и отключите «Включить оценку свойств и другие неявные вызовы функций» и включите «Перейдите по свойствам и операциям (Только управляемый) ".
Может быть, это помогает.

+0

Я искал что-то вроде этого, спасибо! К сожалению, это обходное решение ничего не меняет, что странно. Я также добавлю, что во время построения m_A всегда имеет значение null, поэтому свойство IsConnected никогда не должно читаться. –

+0

Не забудьте сначала вызвать InitializeComponents(). –

+0

InitializeComponents() вызывается первым, все равно получайте исключение, хотя! This.DesignMode и m_A! = Null должны оба сбой. –

0

Как отметил Ари Рот, 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; 
} 

Используйте его так же, как описывает Саймон Линдер.

0

Похоже, что дизайнер использует старую версию DLL управления, которая не имеет свойства IsConnected.

Исключение MissingMethodException не связано со значением m_A. Компилятор JIT жалуется, что свойство отсутствует. Если вы переносите вызов в m_A.IsConnected в методе, он работает, потому что этот метод не вызывается (поскольку m_A действительно имеет значение NULL), поэтому он не закодирован, поэтому свойство IsConnected не требуется.

Когда вы помещаете элемент управления в форме в VS, конструктор создает «реальный» экземпляр вашего элемента управления в форме, вызывающей конструктор, что вызывает проблему компиляции JIT.

+0

Обнаружение вызова в функции «ное» работает так же, как вы говорите. Однако я не понимаю, как разработчик мог использовать старую DLL, я много раз строил и перестраивал ... –

+0

К сожалению, я тоже. Если бы у вас была старая версия в GAC, это объяснило бы это, но она не будет работать и во время выполнения. Я думаю, вы также покинули VS, удалили каталоги obj и bin и повторно запустили VS. – Timores