2011-01-07 15 views
1

私はC#ライブラリを呼び出す必要があるネイティブC++アプリケーションを持っています。さまざまなオプションを調べた後、C++/CLIライブラリをラッパーとして追加して、2つの間のダイレクトインターフェイスを処理するようにしました。私は非常に大きな配列を持っているので、私はC++からC#に渡しています(Marshal :: Copyでコピーを作るのは大変です)。私は構文を解決することができませんでした。C++/CLIによるC#配列へのネイティブC++配列

Cは#関数宣言:

void Computation::passInVolume(int size, short volume[]) 

C++/CLI機能:

void Wrapper::passInVolume(int size, short volume[]) 
{ 
    //this call succeeds, but does not contain my data 
    array<short>^ locArray = gcnew array<short>(size); 

    // This line produces: error C2440: 'type cast' : cannot convert from 
    // 'short []' to 'cli::array<Type> ^' 
    array<short>^ locArray2 = (array<short>^)volume; 

    // call requires array<short>^ as input type 
    Computation::passInVolume(size, locArray); 
} 

C++コード:

volImage = (short*)malloc(size*sizeof(short)); 
... 
wrapper->passInVolume(size, volImage); 

私は行方不明です、これをキャストする方法はありますか?私はこれを他の方法で成功させました。C#をC#から呼び出しました。元帥::コピーを経由してコピーを作成すること

答えて

1

あまりにも悪い問題外です。 .NETの配列は常にマネージヒープ上にあるため、そうでないと.NETに納得させることはできません。

  • は(そしてもちろん長さを運ぶために、必要なパラメータを追加)ポインタを使用するC#のコードを書き直し

    は、あなたはまだコピーを含まないいくつかのオプションがあります。 C#はネイティブに割り当てられたポインタを使用し、残りの要素を見つけるためのポインタ演算を実行できます。

  • 外部提供のバッファを使用するようにC++ライブラリを書き換えます。 C++はすでにポインタを使用しているので、C#配列を所定の位置に固定し、その内容へのポインタをネイティブライブラリに渡すことができます。

+0

私はリファクタリングをC#のポインタを使用して終了しました。努力は私が最初に考えたほど悪くはなかった。 – Beast