2009-05-18 18 views
3

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

私は個人的にはそれが価値があると言いますが、他の投稿と同意しないと簡単です。

可能なアプローチであり得る:

  1. C++周りCインタフェースとDLLとして公開します。
  2. COMオブジェクト(altho WMはCOMサーバーをサポートしていないため、インプロセスサーバー(基本的にはDLL COM実装)を使用する必要があります)。これはより多くのオブジェクト指向のインターフェイスを提供します。
  3. 何らかのAPIを公開しているバックグラウンドプロセス。あなたは、 "CEサービス"モーダルを下に行くか、独自のAPIを考え出すことができます。

すべてが可能であり、長所と短所があります。どんなことをしても、インターフェイスにSTLタイプを使用することはできません。プロセス間のマーシャリングが容易な単純な基本型に減らしました。 C#について話をしてから、OOインターフェイスを公開できるようになるとCOMが進むかもしれません。

2つのインターフェイスをできるだけシンプルにすることをお勧めします。

+0

オプション3が何を意味するのか分かりませんが、ヒントはありがとうございます。インターフェイスが広すぎることに同意し、C#とC++の間のブリッジをできるだけ小さくする必要があります。現在、イテレータ参照も返されます。イテレータ参照は、それらがインクリメントまたは参照解除されるたびに、ピボーク呼び出しを必要とします... eek。 – Akusete

+0

オプション3:バックグラウンドで実行されるアプリケーション(exe)を作成します(これは常に実行するか、GUIフロントエンドによって開始および停止されます)。何らかのAPIを使用してフロントエンド(GUI)アプリケーションと通信しますあなたは、共有メモリやメッセージキューなどの好きなものを使うようにします。 Win32サービスのように並べ替えます。あなたのバックグラウンドアプリケーションは通常、何らかのイベントループでコマンドを受け取り、処理します。 –

0

多分、あなたはcomラッパーを書いて、自動的にあなたのためのC#アセンブリを作成する.netツールを使うべきですか?

+0

Windows MobileにCOMサブシステムがあるとは思わない... – JasonRShaver

+0

Windows MobileにCOMがあります –

+0

ありますが、CFにCOM interopはありません。 – ctacke

1

あなたがしたいことはまったく簡単ではありません。 の場合、実際にはにしたければ、C++とSTLのすべてをラップし、.netからCにうまくいく構造を渡すクリーンなCインターフェイスを作成することをお勧めします。あなたが持っているコードベースの大きさにもよりますが、それは非常に難しい作業です。

申し訳ありません。

+0

アドバイスをいただきありがとうございます、私はこれが当てはまると仮定しましたが、その道を行く前に確かめたいと思っていました。 – Akusete

0

SWIGではC++用のC++ラッパーを作成していませんか?複雑なC++のすべての非基本的なものを渡すのと同じように?私が似たような状況にあるために私が間違っている場合、私は非常に大きく複雑なC++ apiをdllで公開したいと考えています.iはCスタイルを記述することによってマングリングと非基本データ型を避ける必要がありますそれをピンポークする前にすべてのものを公開するラッパーとapiのサイズと型とプロトタイプの複雑さを与えられた自動ツールなしでは実行不可能です。