none
WinFormsControl in MFC --> System.ExecutionEngineException RRS feed

  • Frage

  • Hallo,

    ich habe plötzlich ein Problem mit einem älteren Stück Source-Code. Der gleiche Source-Code funktioniert auf den Rechnern meiner Kollegen.

    Ich habe ein WinformsControl in eine MFC-Anwendung (MultiDocument - mehrere FormViews) eingebunden:

    Deklaration im .h:

    Microsoft::VisualC::MFC::CWinFormsControl<TestBase::TestBase> m_ctrlSmallTest;
    

     

    Die Instanziierung in

    void CTestView::DoDataExchange(CDataExchange* pDX)
    {
    	CCommonView::DoDataExchange(pDX);
    	Microsoft::VisualC::MFC::DDX_ManagedControl(pDX, IDC_STATIC_COMMON_TESTSMALL, m_ctrlSmallTest);
    
    ...
    }
    
    

     

    wird mit einer "System.ExecutionEngine.Exception" beendet.

    Wenn ich tiefer in den DDX_ManagedControl() -Aufruf debugge, wird:

    - der Konstruktor des C#-Controls richtig aufgerufen

    - Die Überprüfung: ASSERT(GetControlHandle()!=NULL); wirft die Exception.

    inline TManagedControl^ CWinFormsControl<TManagedControl>::GetControl() const
    
    {
    
    CWinFormsControlSite* pSite=static_cast<CWinFormsControlSite*>(m_pCtrlSite);
    
    TManagedControl^ pCtrl=nullptr;
    
    if (pSite)
    
    {
    
    pCtrl=static_cast<TManagedControl^>(pSite->get_Control());
    
    }
    
    return pCtrl;
    
    }
    
    
    letztlich schlägt die get-Funktion fehl.
    
    inline System::Windows::Forms::Control^ CWinFormsControlSite::get_Control() const
    {
    
    System::Windows::Forms::Control^ pControl=m_gcEventHelper->Control::get();
    
    ...
    
    }
    
    
    

    Offensichtlich ist der Pointer

    CWinFormsEventsHelper^ 

    m_gcEventHelper fehlerhaft! Das Attribut- 'value' ist leer.

     

    Nachdem derselbe Code auf einem anderen Rechner funktioniert, denke ich, dass das Problem entweder an der Einstellung meiner Entwicklunsumgebung, oder an der Konfiguration meines Rechners liegen, oder?

    Wenn ich die Anwendung im Release-Mode laufen  lasse, verhält sie sich leicht anders. Sie kann fast normal Starten (Die Views mit dem nicht funktionierenden Control werden nicht richtig angezeigt). Sobald aber einer der Views, in dem das problematische Control platziert  ist aktualisiert wird, wird eine

    "System.ArgumentException" mit dem Hinweis

    "GCHandle kann nicht zwischen AppDomains übergeben werden."

     geworfen.

    Ich arbeite mit VisualStudio 2008 : 9.0.30729.1 SP auf Vista Sp2 

     

    Ich würde mich  über eine baldige Antwort sehr freuen, vielen Dank im Voraus

     

    Freitag, 5. November 2010 22:37

Antworten

  • Ich habe das Problem mittlerweile selbst gelöst. Wie sich in meiner vorigen Antwort schon angedeutet hat, war eine Neuinstallation von VS2008 notwendig. Die Ausführung der Systemsteuerung\Programme und Funktionen 'Reparieren / Neu installieren' hat nicht den gewünschten Erfolg gebracht. Ich musste VS deinstallieren und wieder neu installieren.

     

     

    • Als Antwort markiert old fashioned Dienstag, 9. November 2010 12:45
    Dienstag, 9. November 2010 12:45

Alle Antworten

  • Ich vermute, dass in der C# Assembly (dem WinForms-UserControl) etwas geändert wurde.
    Zuerst sah es für mich so aus, als ob eine Abhängigkeit der Assembly nicht aufgelöst werden kann. Kannst Du diese Assembly (und genau die gleichen DLLs) in einem simplen C# Form ohne Probleme verwende?

    Der Release-Fehler ist schon etwas komischer... bist Du sicher, dass Du immer nur aus dem "Main-GUI"-Thread auf das Control zugreifst bzw. es auch dort anlegst?


    Jochen Kalmbach (MVP VC++)
    Samstag, 6. November 2010 07:46
  • Vielen Dank, für den Tip.

    Ich habe nochmal zwei kleine Testanwendungen erstellt. Einmal C#, dort funktioniert das bisherige Control, und eine MFC-Anwendung, dort tritt der gleiche Fehler auf wie oben beschrieben!??!??!?

    Mein Source-Code steht unter Versionsvewaltung. --> Auch wenn ich auf ältere Versionen zurückgehe, tritt dieser Fehler auf. --> Es kann meiner Meinung nach nur an meiner IDE liegen. Allerdings weiß ich nicht, was die Probleme verursachen könnte.

    Zusätzlich habe ich auf einer virtuellen Maschine VS 2008 nochmals installiert --> dort funktioniert der identische Code (nachdem es neukompiliert wurde), die original exes Verhalten sich wie auf dem Original-System.

    Leider hat die Neuinstallation auf der virtuellen andere Probleme, die ich jedoch hoffentlich per google lösen kann (rgclsidAllowed ist nicht definiert), daher scheue ich mich auf dem Originalrechner VS einfach neu zu installieren. Könnte eine Einstellung der IDE meine Probleme auslösen? Ich bin mir allerdings nicht bewusst etwas verändert zu haben.

    Sonntag, 7. November 2010 21:57
  • Ich habe das Problem mittlerweile selbst gelöst. Wie sich in meiner vorigen Antwort schon angedeutet hat, war eine Neuinstallation von VS2008 notwendig. Die Ausführung der Systemsteuerung\Programme und Funktionen 'Reparieren / Neu installieren' hat nicht den gewünschten Erfolg gebracht. Ich musste VS deinstallieren und wieder neu installieren.

     

     

    • Als Antwort markiert old fashioned Dienstag, 9. November 2010 12:45
    Dienstag, 9. November 2010 12:45
  • Hmm. Schade, dass man es nicht mehr ausprobieren kann.
    Es könnte sein, dass die entsprechenden passenden Runtime Module nicht vorhanden waren.
    Es gibt 3 VS-2008 Runtimes:
    VS-2008 RTM
    VS-2008 mit MFCNext
    VS-2008 SP1

    Evtl. war hier etwas falsch oder nicht passend.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 9. November 2010 14:17
    Moderator