WPF создает исключительный синтаксический анализ XAML, который включает пользовательский элемент управления Winforms - PullRequest
7 голосов
/ 23 октября 2008

У меня есть приложение WPF, которое использует пользовательский элемент управления Winforms, который я создал с помощью C ++ / CLI. Когда мое приложение выполняет синтаксический анализ XAML для моего главного окна, оно выдает исключение. Информация выглядит несколько сокращенной, но в ней говорится:

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.

Я прокомментировал свой элемент управления Winforms в XAML, и все загружается нормально. Я подумал, что, возможно, конструктор для моего элемента управления делает что-то плохое, поэтому я установил в нем точку останова, но точка останова не активируется, когда я запускаю приложение, и никогда не срабатывает, что, как я понимаю, означает DLL содержащий эту строку не загружается. Что, скорее всего, вызовет исключение при создании экземпляра объекта типа в DLL - тело конструктора объекта не может быть найдено.

В прошлом я успешно делал это в другом проекте, поэтому я извлек пользовательский элемент управления WinForms из этого приложения и создал его в XAML, и все работает нормально.

Так что-то в этой DLL. У меня есть ссылка на DLL в моем приложении WPF C #, и когда я загружаю DLL в Object Browser, все необходимые классы и пространства имен отображаются нормально. Приложение прекрасно компилируется, проблема просто обнаруживается при разборе XAML. Кто-нибудь видел что-то подобное? Любые идеи относительно того, что может быть причиной этого? Идеи для его отладки? Спасибо!

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

Ответы [ 6 ]

10 голосов
/ 23 октября 2008

У меня возникли подобные проблемы (но не с точно таким же сообщением об ошибке). Похоже, что WPF не может создать экземпляр вашего пользовательского элемента управления Winforms.

Задача состоит в том, чтобы выяснить, почему. Вот мои предложения, которые вы можете попробовать:

  1. Проверьте, включена ли неуправляемая отладка (в Свойствах проекта -> Отладка)
  2. Выясните, есть ли какие-либо зависимости в вашей C ++ / CLI DLL, где реализован элемент управления Winforms, и если эти зависимости не могут быть разрешены.
    Чтобы выяснить зависимости от собственных DLL, вы должны использовать инструмент Dependency Walker (зависимость.exe) . .NET Reflector будет проверять только управляемые зависимости.
  3. Шаг за шагом закомментируйте код вашего пользовательского элемента управления Winforms и попробуйте снова.
  4. Используйте Gflags.exe для включения Оснастки загрузчика (ср. Отладка ошибок LoadLibrary )
1 голос
/ 19 мая 2011

У меня были симптомы симуляции, и моя проблема заключалась в том, что проект C # был настроен на использование любого процессора, в то время как проект C ++ был настроен на использование x86. Чтобы настроить оба для использования x86, решена проблема

1 голос
/ 27 октября 2009

Я видел эту проблему при попытке использовать boost :: threads. Чтобы поддерживать локальное хранилище потоков, boost :: threads делает некоторый вызов Win32 API, который несовместим с приложениями CLI. Проблема возникает, если вы пытаетесь #include что-то из потоков в коде CLI.

Решение состоит в том, чтобы либо вообще не использовать boost :: threads, либо ограничить его использование .cpp файлами в собственном коде.

0 голосов
/ 10 апреля 2013

У меня также было это сообщение об освобождении, но мои решения меняли порядок элементов XAML. Я использовал XmlDataProvider и отображал содержимое в списке. Я просто поместил XmlDataProvider перед ListBox.

0 голосов
/ 16 июля 2009

Вы уверены, что у вас есть dll либо в папке system32, либо в той же папке, что и exe. Я получил точно такое же сообщение об ошибке при запуске проекта WPF, созданного с помощью библиотеки CLI, в то время как библиотека DLL находилась в другой папке.

микрофон

0 голосов
/ 03 апреля 2009

У меня тоже была эта проблема, и все, что мне нужно было сделать, это зайти в свойства проекта> Безопасность и щелкнуть Это приложение с полным доверием. Я снова запустил свой проект, и он заработал!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...