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只能启动一次