2008-10-22 89 views
7

我有一個WPF應用程序,它利用我使用C++/CLI創建的Winforms用戶控件。當我的應用程序去解析我的主窗口的XAML時,它會拋出一個異常。該信息似乎有點縮寫,但它說:WPF引發異常解析包含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> 

回答

10

我遇到過這樣的問題(但沒有完全相同的錯誤信息)。看起來好像WPF不能實例化你的Winforms用戶控件。

挑戰是找出原因。這裏是我的建議,你可以嘗試:

  1. 檢查,如果你已經啓用非託管調試(在項目屬性 - >調試)
  2. 瞭解是否有任何依賴你的C++/CLI DLL,其中的WinForms控制實施,如​​果這些依賴關係不能解決。
    爲了找出對本機DLL的依賴關係,你應該使用工具Dependency Walker (depends.exe)。 .NET Reflector只會檢查託管的依賴關係。
  3. 逐步註釋掉Winforms用戶控件的代碼,然後重試。
  4. 使用Gflags.exe打開裝載機卡(參見Debugging LoadLibrary Failures
+0

問題,#1應該啓用或不?我有同樣的錯誤,它沒有啓用,我應該啓用它嗎? – 2012-11-04 23:49:41

0

我也有這個問題,所有我所要做的就是進入項目屬性>安全,點擊這是一個完全信任的申請。我再次運行我的項目,它的工作!

0

你確定你有dll在system32文件夾中或與exe文件在同一個文件夾中。在運行使用CLI DLL構建的WPF項目時,我得到了完全相同的錯誤消息,而DLL位於不同的文件夾中。

邁克

1

試圖使用boost ::線程時,我已經看到了這個問題。爲了支持線程本地存儲,boost :: threads創建了一些與CLI應用程序不兼容的Win32 API調用。如果您嘗試從CLI代碼中的線程#include某些內容,則會觸發該問題。

解決方法是完全避免使用boost :: threads或將其用於本地代碼中的.cpp文件。

1

我有類似的症狀,我的問題是C#項目設置爲使用任何CPU,而C++項目設置爲使用x86。設置兩個使用x86解決了問題

0

我也有這個執行消息,但我的解決方案正在改變XAML元件的順序。我正在使用XmlDataProvider並在列表框中顯示內容。我只是把XmlDataProvider放在ListBox之前。