MissingMethodException quando si apre un modulo nella finestra di progettazione; runtime funziona bene

StackOverflow https://stackoverflow.com/questions/2222218

Domanda

Diciamo che ho un projoct A con una classe A, che ha questa proprietà:

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

Nella stessa soluzione, Ho un progetto B che i riferimenti del progetto A e ha un controllo utente denominato Accedi . Questo controllo ha questo attributo:

    private A m_A = null;

e nel contructor di Accedi che faccio questa chiamata:

  

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

nello stesso progetto, la forma principale ha su di esso un controllo utente A che è stato aggiunto con la forma designer. Il programma funziona bene e questa proprietà viene letta correttamente.

Tuttavia, quando si apre la forma principale in Progettazione ottengo questo execption: MissingMethodException: 'booleano A.get_IsConnected ()'

Commentando m_A.IsConnected cerchiamo di farmi usare il progettista, ma questo è sempre piuttosto fastidioso. E a volte sembra che casualmente funziona.

Tutte le idee?

È stato utile?

Soluzione

Mi è stato detto in passato che this.DesignMode non è sempre perfettamente affidabile. L'altra opzione è possibile utilizzare è direttive del preprocessore:

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

Quindi aggiungere un simbolo denominato compilazione condizionale PROGETTAZIONE e si dovrebbe essere d'oro.

Altri suggerimenti

Invece di commentare fuori si può usare:

if (this.DesignMode)
{
    return;
}

o

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

Modifica: Ricordo di aver problemi con una classe Singleton volta. Il problema era che il Singleton è sempre stata inizializzata anche se il costruttore non è mai stato chiamato. Se ho capito bene il tuo problema il problema è lo stesso. Il vostro membro m_A non è mai NULL anche se dovrebbe essere.
Sono riuscito il mio problema con il seguente:
In Visual Studio passare a "Strumenti \ Opzioni ... \ debug \ generali" e disabilitare "Abilita valutazione di proprietà e l'altra funzione implicita chiamate" e attivare "Passo sopra le proprietà e gli operatori (solo Managed)".
Forse questo aiuta.

Come notato da Ari Roth DesignMode non funziona bene. Per compensare questo, io uso questo metodo di estensione:

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;
}

Si usa nello stesso modo che Simon Linder descrive.

Sembra che il designer sta usando una vecchia versione della DLL di controllo, che non ha la proprietà IsConnected.

L'eccezione MissingMethodException non è correlato al valore del m_A. E 'il compilatore JIT lamentando che la proprietà è mancante. Se si avvolge la chiamata a m_A.IsConnected in un metodo, funziona, perché questo metodo non viene chiamato (perché m_A è davvero nullo), quindi non jitted, in tal modo la proprietà IsConnected non è necessaria.

Quando si inserisce il controllo in una forma in VS, il designer crea un'istanza di "reale" del vostro controllo nella forma, che chiama il costruttore, che causa il problema JIT di compilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top