web-dev-qa-db-ja.com

C#WPFアプリケーションでC ++ 11ライブラリを使用するためのオプションは何ですか?

C++ 11でクロスプラットフォーム(OS XおよびWindows)デスクトップアプリケーションを書いています。両方のプラットフォームで同じC++ 11コアを使用し、UIのネイティブフレームワーク(OS XではCocoaとObjective-C、WindowsではWPFおよびC#)を使用する予定です。

現在、アプリケーションは両方のプラットフォームでコンソールアプリとして実行されます。アプリケーションは、CPUを集中的に使用する作業を実行し、進行状況レポートのコールバックを提供し、完了すると、項目のコレクションをインスタンス化します(std::vector<std::unique_ptr<Item>>)処理の結果を表します。

私の目標は、C++ 11ライブラリがMVCおよびMVVMパターンと互換性のある方法でUIのモデルとして機能することです。

UIは:

  • ユーザーが処理するファイルを選択できるようにします(ファイルダイアログを開き、ファイルパスをC++ライブラリに送信します)
  • 進行状況を表示(C++ライブラリからのコールバックを処理して進行状況バーを更新)
  • 結果をWPFフォームで表示します(Itemクラスにアクセスし、それが提供する情報を表示します)

私はWinRTを調べましたが、デスクトップアプリケーションで使用するための情報はそれほど多くないようです。また、C++でUI自体を作成するアイデアも好きではありません。私の目標は、C++アプリとの間でデータを取得し、C#を使用してUIを処理することです。これは、WPFを操作するためのより効率的な方法だと思います。

P/Invokeは知っていますが、Cインターフェースでのみ機能することを理解しています。 C++ 11の周りにそのようなインターフェースを作成するのは面倒なようです。

C++/CLIも知っていますが、それが私のニーズを満たすかどうか、またはC++ 11と互換性があるかどうかはわかりません。

CppSharp を確認しましたが、進行中のようで、発生する可能性のある問題を回避する方法がわからないと思います。

C++については多くの経験があり、C#については少し経験がありますが、より優れたオプションがないか、または上記のうちどれが適切なアプローチであるかわかりません。

5
Rotsiser Mho

[〜#〜] swig [〜#〜] C++コード用に C#ラッパー を生成できます。私はこのためにそれを使用した経験がないので、それがどれだけうまく機能するのかわかりません。

SWIGの現在のリリース(バージョン2.x)は少なくともC++ 11をサポートしていると思いますが、完全にサポートするには 開発バージョン を使用する必要があるかもしれません。

2
Josh Kelley

答えの一部...

ほとんどの場合、この問題の解決策では、3つのレイヤーで仕上げます。

  1. Windows APIまたはCOMまたはC++ライブラリを呼び出すことができるネイティブC/C++レイヤー
  2. C#オブジェクトモデルとフレームワークにアクセスできるマネージC/C++レイヤー
  3. C#レイヤー。これは、C#で.NET FrameworkとWPFを実際に使用する方が簡単だからです。

P/Invokeは、ネイティブコードとマネージコード間の呼び出しを指しますが、この種の構造では、層の内部で行われます(2)。レイヤー(2)は、以前はマネージドC++でしたが、現在はC++/CLIに置き換えられています。各層はその隣の層と簡単に通信できますが、(1)は(3)と簡単に通信できない、またはその逆です。

ちょうどあなたが望むとおりに機能する製品を見つけるかもしれませんが、私はそれを知りません。このような階層構造で必要なものを記述する必要がある可能性が高くなります。

私はこれを3回以上、3世代以上のマネージC/C++で実行しました。この方法で構築された商用製品(レガシーC/C++ <=> ASP.NET/remoting)があります。管理対象レイヤーの世代はそれぞれ異なりますが、全体的な構造は同じです。 [編集]

私は提案します:いくつかのコードを書きますが、それを捨てる計画を立てます。実験は順調です。

1
david.pfx

WindowsのネイティブUIとは何ですか? WPFは「標準」に見えません。Silverlightのように、WinformとMFCは機能しません。特にWindows8タイルを作成している場合は、最もネイティブなアプリがHTMLであると言えます。

したがって、私の提案は、ネイティブコントロールを使用してレンダリングする wxWidgets を使用することです。 UIは「モダン」ではなく、従来のWindowsプログラムのように見えますが、それが目的でしたね。

それでもGUIにWPFを使用する必要がある場合は、C++ dllを呼び出すC++/CLIインターフェイスラッパーを作成するか、dllをサービスとして公開して、WPFにソケット(または他のRPC)呼び出しを行わせることができます。 。非常におしゃべりの場合、これは最良の解決策ではありませんが、長時間の呼び出しがほとんどない場合は、理想的です。この場合、サービスを WWS Webサービス として公開しますが、サービスもdllにWebフロントエンドをバインドするための最良のソリューションです。

0
gbjbaanb