0

C# で記述された SDK の機能を必要とする既存の Java プロジェクトがあります。WPF ウィンドウを開き、閉じるときに情報を Java に送り返す必要があります。

これら 2 つの世界の基本的な接続のために、ネイティブ関数を呼び出す Java プロジェクト ("DotNetCaller") を作成しました。これらは、C# プロジェクト (「DotNetApplication」) を呼び出す C++/CLI プロジェクト (「DotNetBridge」) で実装されます。

私はすでに C# で Java から文字列を設定し、C# から Java にコールバックすることができます。

しかし、WPFウィンドウを追加して起動しようとするとすぐに:

 Application app = new Application();
 app.Run(new DotNetWindow());

STA スレッドではクラッシュします。

DotNetApplication は mscorlib.resources を見つけられません。DLL を提供した後、PresentationFramework.resources が見つかりません。それを提供すると、DotNetApplication.resource が見つかりません (提供できません)。

DotNetApplication を単独で呼び出すか、DotNetBridge から呼び出すと、ウィンドウは期待どおりに表示されます。

ここで私が本当に欠けているものを誰か教えてもらえますか?

ありがとう

編集:

この例をもう一度見て、自分のニーズに合わせようとしました。「参照されたアセンブリ」で、ResolveEventHandler の dll ディレクトリを .NET ディレクトリに設定しました。

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0

C#でウィンドウを追加しました。

これも失敗しましたが、C# ではなく C++ 部分に新しい例外がありました。ResolveHandler が空の引数で呼び出されると、mscorelib でキャッチできない例外が発生します。String が空であるかどうかのチェックを追加し、この基本的なアプローチが正常に機能するようになりました。

これに対する正しいアプローチがあるかどうかはまだわかりませんので、お気軽に貢献してください。

4

1 に答える 1

1

ハンドラーはおそらくオーバーホールする必要があり、何をしたいのかについてのあなたAppDomain::AssemblyResolve自身の理解に基づいています。ここにいくつかのガイダンスがあります。基本的なルールは、nullptr処理できない要求に対して戻ることです。

ただし、最初に、アセンブリを展開 (および/またはデバッグ) する場所を計画する必要があります。簡単なレイアウトは、JNI DLL が依存するすべてのアセンブリを JNI DLL と同じフォルダーに配置することです (GAC にインストールされるアセンブリを除く)。その後、その場所を使用して解決要求を満たすことができます。nullptrただし、要求された名前のアセンブリのマニフェストを含むファイルがそこに存在しない場合は、忘れずに戻ってください。(「.resources」リクエストの場合がこれに該当する可能性があります。特に指定がない限り、リソースがない場合は問題ありません。)

Reference Assembliesフォルダー内のアセンブリが GAC にも含まれていないとしたら、少し驚きますが、それはアセンブリ プロバイダー次第です。Reference Assemblies設計およびビルド ツール (Visual Studio など) 用です。(古い方法では、アセンブリを含む各フォルダーを Visual Studio の各バージョンに登録して、アセンブリを設計とビルドに使用できるようにしていました。) 依存関係が GAC にない場合は、「ローカルのコピー」を使用できます。 " プロパティを参照に追加して、デバッグに使用できるようにします。

Assembly Binding Log Viewerは、設計およびトラブルシューティングの際に役立つ場合があります。AppDomain::AssemblyResolveこれを使用すると、ハンドラー チェーンの呼び出しをあきらめる前に試行されるすべてのフォルダーと拡張機能を確認できます。(完了したら、ロギングを無効にします。)

于 2013-07-05T00:06:09.170 に答える