WPF解析包含Winforms用户控件的XAML时抛出异常

7

我有一个使用C++/CLI创建的Winforms用户控件的WPF应用程序。当我的应用程序尝试解析主窗口的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>
6个回答

10

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

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

  1. 检查是否已启用非托管调试(在“项目属性”->“调试”中)
  2. 找出您的C++ / CLI DLL中实现Winforms控件的任何依赖项,以及这些依赖项是否无法解决。
    为了查找对本机DLL的依赖关系,您应该使用工具Dependency Walker(depends.exe)。 .NET Reflector仅检查托管依赖项。
  3. 逐步注释Winforms用户控件的代码,然后再次尝试。
  4. 使用Gflags.exe打开Loader Snaps(参见调试LoadLibrary Failures)

问题,#1 应该启用还是不启用?我遇到了相同的错误,它没有启用,我应该启用它吗? - John Demetriou
1
@macrian:我写下答案已经有一段时间了,但我认为你应该启用非托管调试。这样,你将在调试器中看到更多的输出,有助于你追踪问题所在。 - EFrank
我知道,实际上已经是四年了 :P 虽然如此,还是谢谢你的帮助 :D - John Demetriou

1

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


1
我曾经在尝试使用boost::threads时遇到过这个问题。为了支持线程本地存储,boost::threads会进行一些Win32 API调用,这与CLI应用程序不兼容。如果您尝试在CLI代码中#include来自threads的内容,则会触发该问题。
解决方案是要么完全避免使用boost::threads,要么将其使用限制在本机代码的.cpp文件中。

0

我也遇到了这个异常消息,但我的解决方法是改变XAML元素的顺序。我正在使用XmlDataProvider并在ListBox中显示内容。我只需要将XmlDataProvider放在ListBox之前。


0
你确定你的dll文件在system32文件夹或者和exe文件在同一个文件夹里吗?当我运行一个使用CLI dll构建的WPF项目时,如果dll文件不在同一个文件夹里,我也会得到完全相同的错误信息。
Mike

0

我也遇到了这个问题,解决方法是进入项目属性>安全,然后勾选“这是一个完全信任的应用程序”。再次运行项目就可以解决问题了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接