WPF 引发异常解析 XAML,其中包括 Winforms 用户控件

Posted

技术标签:

【中文标题】WPF 引发异常解析 XAML,其中包括 Winforms 用户控件【英文标题】:WPF throwing an exception parsing XAML that includes a Winforms User Control 【发布时间】:2010-09-18 15:51:11 【问题描述】:

我有一个 WPF 应用程序,它使用了我使用 C++/CLI 创建的 Winforms 用户控件。当我的应用程序为我的主窗口解析 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.

我在 XAML 中注释掉了我的 Winforms 控件,一切正常。我想也许我的控件的构造函数做错了,所以我在其中设置了一个断点,但是当我开始运行应用程序时断点似乎没有启用,并且从未被命中,我理解这意味着 DLL包含该行的内容未加载。当 DLL 中的某个类型的对象被实例化时,这很可能会导致引发异常 - 找不到对象的构造函数的主体。

我过去在另一个项目中成功完成了此操作,因此我从该应用程序中提取了一个不同的 WinForms 用户控件,并在 XAML 中对其进行了实例化,一切正常。

所以它在这个 DLL 中。我在我的 WPF C# 应用程序中引用了 DLL,当我在对象浏览器中加载 DLL 时,所有必需的类和命名空间都显示得很好。该应用程序编译良好,问题只是在解析 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>

【问题讨论】:

【参考方案1】:

我遇到过类似的问题(但不是完全相同的错误消息)。似乎 WPF 无法实例化您的 Winforms 用户控件。

挑战在于找出原因。以下是我的建议,您可以尝试:

    检查您是否启用了非托管调试(在项目属性 -> 调试中) 找出实现 Winforms 控件的 C++/CLI DLL 是否存在任何依赖关系,以及这些依赖关系是否无法解析。 为了找出对本机 DLL 的依赖关系,您应该使用工具 Dependency Walker (depends.exe)。 .NET Reflector 只会检查托管依赖项。 一步一步注释掉你的Winforms用户控件代码,然后重试。 使用 Gflags.exe 打开Loader Snaps(参见Debugging LoadLibrary Failures)

【讨论】:

问题,#1 应该启用还是不启用???我有同样的错误,它没有启用,我应该启用它吗? @macrian:我写答案已经有一段时间了,但我认为你应该启用非托管调试。这样,您将在调试器中看到更多输出,可以帮助您跟踪问题。 我知道,实际上已经四年了 :P 谢谢你的帮助 :D【参考方案2】:

我在尝试使用 boost::threads 时发现了这个问题。为了支持线程本地存储,boost::threads 进行了一些与 CLI 应用程序不兼容的 Win32 API 调用。如果您尝试在 CLI 代码中#include 来自线程的某些内容,则会触发该问题。

解决方案是要么完全避免使用 boost::threads,要么将其使用限制在本机代码中的 .cpp 文件中。

【讨论】:

【参考方案3】:

我有类似的症状,我的问题是 C# 项目设置为使用 Any CPU,而 C++ 项目设置为使用 x86。将两者都设置为使用 x86 解决了问题

【讨论】:

【参考方案4】:

我也遇到了这个问题,我所要做的就是进入项目属性>安全并单击这是一个完全信任的应用程序。我再次运行我的项目,它成功了!

【讨论】:

【参考方案5】:

你确定你的 dll 在 system32 文件夹中还是在与 exe 相同的文件夹中。在运行使用 CLI dll 构建的 WPF 项目时,我得到了完全相同的错误消息,而 dll 位于不同的文件夹中。

麦克

【讨论】:

【参考方案6】:

我也收到了这条执行消息,但我的解决方案是更改 XAML 元素的顺序。我正在使用 XmlDataProvider 并在列表框中显示内容。我只是将 XmlDataProvider 放在 ListBox 之前。

【讨论】:

以上是关于WPF 引发异常解析 XAML,其中包括 Winforms 用户控件的主要内容,如果未能解决你的问题,请参考以下文章

WPF App.xaml.cs常用模板,包括:异常捕获,App只能启动一次

在其中运行 wpf 应用程序后无法卸载 AppDomain

2021-09-20 WPF上位机 30-模型加载(HelixToolKIt使用)

在 WPF 中折叠网格

WPF 窗口扩展到全屏

WPF 找不到App.xaml里面的样式的问题