C#.NETのCFからpInvokeで使用するC++プログラムを変更するにはどうすればよいですか?C#/ C++ pInvoke tips
私は、STLを大量に使用する大きなC++コードベースを持っています。つまり、イテレータ、コンテナクラス、標準文字列です。
これに加え、多くの軽量クラスが値渡しされます。
Windowsモバイルタッチデバイス用のこのコードベースのC#gui ontopを構築したいと考えています。
それは価値がありますか?
私は、pInvokeを使ってC#.NETからC++コードを呼び出すいくつかの例を手に入れることができましたが、すべてのアクセスポイントとすべてのSTL戻り値のラッパーを作成するのは非常に困難で醜いようです。別の方法があるのですか、やや詰まっていますか?
BTW。 Managed C++は、.NET CFによってどのような形式でもサポートされていないため、オプションではありません。
--edit: 私はピンボケに関して1つの特定の質問があります。
は、私はマーシャルへの道は、STL文字列が存在しないためのPInvokeを使ってC#からこの関数を呼び出すことがその可能性はないことを理解し、私の問題は、値
std::string foo() {
return std::string ("Hi");
}
によってC++の文字列を返す関数を持っていたと仮定します返されるstd :: stringがヒープ上にないため、新しい配列を割り当てずにラッパーを書くこともできないということです。
char* foo2() {
return foo().c_str(); //Very bad
//the returned pointer is released when the std::string falls out of scope.
//and will be invalid before the caller is able to do anything with it.
}
だから私の問題は、文字列全体を再割り当てする必要なしのPInvoke適した形式にFOOをラップする方法、です。
char* foo2() {
std::string f = foo();
char* waste = new char[f.length()+1];
strcpy (waste, f.c_str());
return f;
}
私がのstd ::文字列を返す必要がれるすべての点については、上記を行う考えは、私は、C#を使用しようとあきらめせるのに十分です。
オプション3が何を意味するのか分かりませんが、ヒントはありがとうございます。インターフェイスが広すぎることに同意し、C#とC++の間のブリッジをできるだけ小さくする必要があります。現在、イテレータ参照も返されます。イテレータ参照は、それらがインクリメントまたは参照解除されるたびに、ピボーク呼び出しを必要とします... eek。 – Akusete
オプション3:バックグラウンドで実行されるアプリケーション(exe)を作成します(これは常に実行するか、GUIフロントエンドによって開始および停止されます)。何らかのAPIを使用してフロントエンド(GUI)アプリケーションと通信しますあなたは、共有メモリやメッセージキューなどの好きなものを使うようにします。 Win32サービスのように並べ替えます。あなたのバックグラウンドアプリケーションは通常、何らかのイベントループでコマンドを受け取り、処理します。 –