2008-10-22 3 views
7

Ich habe eine WPF-Anwendung, die ein Winforms-Benutzersteuerelement verwendet, das ich mit C++/CLI erstellt habe. Wenn meine App das XAML für mein Hauptfenster analysiert, wird eine Ausnahme ausgelöst. Die Information erscheint etwas verkürzt zu werden, aber es sagt:WPF, das eine Ausnahme parst XAML mit einem Winforms-Benutzersteuerelement

A first chance exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll 

Additional information: is not a valid Win32 application. (Exception from HRESULT: 0x800700C1) Error in markup file 'OsgViewer;component/osgviewerwin.xaml' Line 1 Position 9. 

ich fein aus meiner WinForms Kontrolle in der XAML und alles lädt kommentiert. Ich dachte, vielleicht macht der Konstruktor für meine Steuerung etwas Schlechtes, also habe ich einen Haltepunkt darin eingefügt, aber der Haltepunkt scheint nicht aktiviert zu sein, wenn ich die App starte, und wird nie getroffen, was ich unter DLL verstehe Diese Zeile wird nicht geladen. Dies würde höchstwahrscheinlich eine Ausnahme auslösen, wenn ein Objekt eines Typs in der DLL instanziiert wird - der Körper des Konstruktors des Objekts konnte nicht gefunden werden.

Ich habe dies erfolgreich in einem anderen Projekt in der Vergangenheit getan, also habe ich ein anderes WinForms-Benutzersteuerelement aus dieser App gezogen und in XAML instanziiert, und das alles funktioniert gut.

So ist es etwas in dieser DLL. Ich habe einen Verweis auf die DLL in meiner WPF C# -App, und wenn ich die DLL in Object Browser laden, zeigen alle erforderlichen Klassen und Namespaces gut. Die App kompiliert gut, das Problem taucht nur beim Parsen des XAML auf. Hat jemand so etwas gesehen? Irgendwelche Ideen, was das verursachen könnte? Ideen zum Debuggen? Vielen Dank!

<Window x:Class="OsgViewer.OsgViewerWin" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:int="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 
    xmlns:myns="clr-namespace:MyGlobalNS.MyNS;assembly=MyAssembly" 
... 
     <int:WindowsFormsHost x:Name="m_Host"> 
      <myns:CMyClass x:Name="m_MyClass" /> 
     </int:WindowsFormsHost> 
... 
</window> 

Antwort

10

Ich habe solche Probleme (aber nicht mit der genau gleichen Fehlermeldung) erlebt. Es scheint, als ob WPF das Winforms-Benutzersteuerelement nicht instanziieren kann.

Die Herausforderung besteht darin, herauszufinden, warum. Hier sind meine Vorschläge, die Sie könnten versuchen:

  1. Überprüfen Sie, ob Sie haben es ermöglicht, nicht verwaltete Debuggen (in Projekteigenschaften -> Debug)
  2. Finden Sie heraus, ob es irgendwelche Abhängigkeiten Ihre C++/CLI-DLL, wo die WinForms Kontrolle implementiert und wenn diese Abhängigkeiten nicht aufgelöst werden können.
    Um Abhängigkeiten von nativen DLLs herauszufinden, sollten Sie das Tool Dependency Walker (depends.exe) verwenden. .NET Reflector untersucht nur verwaltete Abhängigkeiten.
  3. Kommentieren Sie Schritt für Schritt den Code Ihrer Winforms-Benutzersteuerung und versuchen Sie es erneut.
  4. Verwenden Gflags.exe auf Loader drehen Snaps (vgl Debugging LoadLibrary Failures)
+0

Frage, # 1 sollte aktiviert sein oder nicht ??? Ich habe den gleichen Fehler und es ist nicht aktiviert, sollte ich es aktivieren? –

+1

@ Macrian: Es ist einige Zeit her, seit ich meine Antwort geschrieben habe, aber ich denke, Sie sollten unmanaged Debuggen aktivieren. Auf diese Weise sehen Sie im Debugger mehr Ausgaben, die Ihnen helfen könnten, das Problem zu finden. – EFrank

+0

Ich weiß, es war tatsächlich vier Jahre: P danke, aber für deine Hilfe: D –

0

Ich hatte auch dieses Problem und alles, was ich tun musste, war in den Projekteigenschaften gehen> Sicherheit und klicken Sie auf dieses eine ist vollständige Vertrauensstellung. Ich habe mein Projekt erneut ausgeführt und es hat funktioniert!

0

Sind Sie sicher, dass Sie die DLL entweder im Ordner System32 oder im selben Ordner mit der exe haben. Ich habe die genau gleiche Fehlermeldung erhalten, wenn ich ein WPF-Projekt mit CLI-DLL ausgeführt habe, während sich die DLL in dem anderen Ordner befand.

mike

1

ich dieses Problem gesehen haben, wenn sie versuchen boost :: Threads zu verwenden. Um threadlokalen Speicher zu unterstützen, macht boost :: threads einen Win32-API-Aufruf, der mit CLI-Anwendungen nicht kompatibel ist. Das Problem wird ausgelöst, wenn Sie versuchen, etwas aus Threads im CLI-Code zu enthalten.

Die Lösung besteht darin, boost :: threads entweder vollständig zu vermeiden oder ihre Verwendung auf .cpp-Dateien in systemeigenem Code einzuschränken.

1

Ich hatte simular Symptome und mein Problem war, dass der C# -Projekt Jede CPU, während das C++ Projekt zu verwenden, wurde festgelegt wurde eingestellt x86 zu verwenden. Um beide gesetzt x86 verwenden das Problem gelöst

0

ich auch diese execption Nachricht hatte, aber meine Lösungen wurde die Reihenfolge der XAML elments ändern. Ich habe einen XmlDataProvider verwendet und den Inhalt in einer Listbox angezeigt. Ich habe den XmlDataProvider einfach vor die ListBox gestellt.