2008-10-22 17 views
7

Tôi có một ứng dụng WPF sử dụng điều khiển người dùng Winforms mà tôi đã tạo bằng cách sử dụng C++/CLI. Khi ứng dụng của tôi đi phân tích XAML cho cửa sổ chính của tôi, nó sẽ đưa ra một ngoại lệ. Thông tin có vẻ hơi viết tắt, nhưng nó nói:WPF ném một phân tích cú pháp XAML ngoại lệ bao gồm một điều khiển người dùng Winforms

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. 

Tôi nhận xét điều khiển Winforms của tôi trong XAML và mọi thứ đều tốt. Tôi nghĩ rằng có lẽ người xây dựng cho điều khiển của tôi đang làm điều gì đó xấu, vì vậy tôi đặt một điểm ngắt trong đó, nhưng điểm dừng dường như không được kích hoạt khi tôi bắt đầu chạy ứng dụng và không bao giờ bị tấn công. có chứa dòng đó không được tải. Mà rất có thể sẽ gây ra một ngoại lệ được ném khi một đối tượng của một loại trong DLL được instantiated - cơ thể của constructor của đối tượng không thể được tìm thấy.

Tôi đã làm điều này thành công trên một dự án khác trong quá khứ, vì vậy tôi đã kéo trong một WinForms User Control khác từ ứng dụng đó, và khởi tạo nó trong XAML, và tất cả đều hoạt động tốt.

Vì vậy, nó là một cái gì đó trong DLL này. Tôi có một tham chiếu đến các DLL trong ứng dụng WPF C# của tôi, và khi tôi tải các DLL trong Object Browser tất cả các lớp học bắt buộc và không gian tên hiển thị tốt. Ứng dụng biên dịch tốt, vấn đề chỉ hiển thị khi phân tích cú pháp XAML. Có ai thấy thứ như thế này không? Bất kỳ ý tưởng nào về những gì có thể gây ra điều này? Ý tưởng để gỡ lỗi nó? Cảm ơn!

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

Trả lời

10

Tôi gặp sự cố như vậy (nhưng không có thông báo lỗi chính xác). Có vẻ như WPF không thể khởi tạo Điều khiển người dùng Winforms của bạn.

Thách thức là tìm hiểu lý do. Dưới đây là gợi ý của tôi mà bạn có thể thử:

  1. Kiểm tra xem bạn đã kích hoạt gỡ lỗi không được quản lý (trong Project Properties -> Debug)
  2. Tìm hiểu xem có bất kỳ phụ thuộc C++/CLI DLL nơi điều khiển Winforms là thực hiện và nếu những phụ thuộc đó không thể được giải quyết.
    Để tìm hiểu các phụ thuộc vào DLL gốc, bạn nên sử dụng công cụ Dependency Walker (depends.exe). .NET Reflector sẽ chỉ kiểm tra các phụ thuộc được quản lý.
  3. Nhận xét mã của Kiểm soát người dùng Winforms của bạn từng bước và thử lại.
  4. Sử dụng Gflags.exe bật Loader Snaps (x Debugging LoadLibrary Failures)
+0

câu hỏi, # 1 có nên được bật hay không ??? Tôi có lỗi tương tự và nó không được kích hoạt, tôi có nên bật nó không? –

+1

@macrian: Đã một thời gian kể từ khi tôi viết câu trả lời của mình, nhưng tôi nghĩ bạn nên bật gỡ lỗi không được quản lý. Bằng cách này, bạn sẽ thấy nhiều kết quả đầu ra hơn trong trình gỡ rối có thể giúp bạn theo dõi vấn đề. – EFrank

+0

Tôi biết, thực sự nó đã được bốn năm: P cảm ơn mặc dù đã giúp đỡ của bạn: D –

0

Tôi cũng có vấn đề này và tất cả những gì phải làm là đi vào các tính chất dự án> Bảo mật và nhấp vào Đây là một ứng dụng tin cậy đầy đủ. Tôi chạy dự án của tôi một lần nữa và nó đã làm việc!

0

Bạn có chắc chắn rằng bạn có dll trong thư mục system32 hoặc trong cùng một thư mục với exe. Tôi nhận được thông báo lỗi chính xác tương tự khi chạy một dự án WPF được xây dựng với dll CLI trong khi dll được đặt trong thư mục khác nhau.

mike

1

Tôi đã thấy vấn đề này khi cố gắng sử dụng tăng :: luồng. Để hỗ trợ lưu trữ thread-local, boost :: threads tạo một số cuộc gọi API Win32 không tương thích với các ứng dụng CLI. Vấn đề được kích hoạt nếu bạn cố gắng # bao gồm một cái gì đó từ các chủ đề trong mã CLI.

Giải pháp là tránh sử dụng boost :: threads hoàn toàn hoặc hạn chế việc sử dụng nó thành tệp .cpp trong mã gốc.

1

Tôi có các triệu chứng mô phỏng và vấn đề của tôi là dự án C# được thiết lập để sử dụng CPU bất kỳ trong khi dự án C++ được đặt để sử dụng x86. Để đặt cả hai sử dụng x86, hãy giải quyết sự cố

0

Tôi cũng có thông báo thực thi này, nhưng các giải pháp của tôi đã thay đổi thứ tự các kỳ thi XAML. Tôi đã sử dụng XmlDataProvider và hiển thị nội dung trong hộp danh sách. Tôi chỉ cần đặt XmlDataProvider trước ListBox.

Các vấn đề liên quan