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

6 に答える 6

10

私はそのような問題を経験しました(しかし、まったく同じエラーメッセージではありません)。WPFがWinformsユーザーコントロールをインスタンス化できないようです。

課題は、その理由を見つけることです。これがあなたが試すことができる私の提案です:

  1. アンマネージデバッグを有効にしているかどうかを確認します([プロジェクトのプロパティ]-> [デバッグ]で)
  2. Winformsコントロールが実装されているC++/ CLI DLLに依存関係があるかどうか、およびそれらの依存関係を解決できないかどうかを確認します。
    ネイティブDLLへの依存関係を見つけるには、ツールDependency Walker(depends.exe)を使用する必要があります。.NET Reflectorは、管理された依存関係のみを調べます。
  3. Winformsユーザーコントロールのコードを段階的にコメントアウトして、再試行してください。
  4. Gflags.exeを使用して、ローダースナップをオンにします( LoadLibraryエラーのデバッグを参照) 。
于 2008-10-23T09:14:00.310 に答える
1

boost :: threadsを使おうとすると、この問題が発生します。スレッドローカルストレージをサポートするために、boost::threadsはCLIアプリケーションと互換性のないWin32API呼び出しを行います。CLIコードにスレッドから何かを#includeしようとすると、問題が発生します。

解決策は、boost :: threadの使用を完全に回避するか、ネイティブコードの.cppファイルへの使用を制限することです。

于 2009-10-27T17:39:38.400 に答える
1

似たような症状があり、問題は、C++ プロジェクトが x86 を使用するように設定されているのに、C# プロジェクトが任意の CPU を使用するように設定されていたことです。x86を使用するように両方を設定すると、問題が解決しました

于 2011-05-19T13:07:56.580 に答える
0

私もこの問題を抱えていました。私がしなければならなかったのは、プロジェクトのプロパティ>セキュリティに移動し、これは完全に信頼できるアプリケーションです. プロジェクトを再度実行したところ、うまくいきました!

于 2009-04-03T15:52:47.900 に答える
0

この execption メッセージもありましたが、私のソリューションは XAML 要素の順序を変更していました。私は XmlDataProvider を使用して、コンテンツをリストボックスに表示していました。ListBox の前に XmlDataProvider を配置しました。

于 2013-04-09T20:58:18.653 に答える