2012-01-24 19 views
3

管理メモリファイルを使用して、c#からC++に整数の配列を渡そうとしています。テキストは簡単に使えるようになっていましたが、私はC++環境の深いところから離れていて、整数の配列に対してこれを調整する方法がわかりません。 C#の側でint []をc#から共有メモリを使用してC++に渡す方法

、私が渡し:

pView = LS.Core.Platforms.Windows.Win32.MapViewOfFile(
       hMapFile,      // Handle of the map object 
       LS.Core.Platforms.Windows.Win32.FileMapAccess.FILE_MAP_ALL_ACCESS, // Read and write access 
       0,        // High-order DWORD of file offset 
       ViewOffset,      // Low-order DWORD of file offset 
       ViewSize      // Byte# to map to the view 
       ); 

byte[] bMessage2 = Encoding.Unicode.GetBytes(Message2 + '\0'); 
Marshal.Copy(bMessage2, 0, pView2, bMessage2.Length); 

ここpView2は、メモリマップドファイルへのポインタです。 C++側で

、私が呼ん:

LPCWSTR pBuf; 
pBuf = (LPCWSTR) MapViewOfFile(hMapFile, // handle to map object 
      FILE_MAP_ALL_ACCESS, // read/write permission 
      0, 
      0, 
      BUF_SIZE); 

私が代わりに整数の配列を処理するために、これを変更するだろうか?ありがとう!

+2

はあなたが私たちに 'pView2'定義のコードを表示することができますか? 'MemoryMappedFile'を使用していない理由は何ですか? – user7116

+0

なぜメモリマップファイルを使用していますか? –

+0

@sixletter、私はそれを追加しました。私はメモリマップファイルを使用しています。これは、アプリケーション間で情報を共有するために非常に高速です。 –

答えて

1

a)int []をbyte []に​​コピーできます。この演算またはビット演算にはBitConverter.GetBytesを使用できます(byte0 =(byte)(i >> 24); byte1 =(byte >>(i >> 16); ...)

b)安全でないint []をターゲットバイト[]にビットコピー(blit)するコード

c)おそらくArray.Copyを使用できます。私はだと思います。はblittable値の型を扱うことができます。私はBに詳しく説明しますコメントを1として

):

int[] src = ...; 
IntPtr target = ...; 
var bytesToCopy = ...; 

fixed(int* intPtr = src) { 
var srcPtr = (byte*)intPtr; 
var targetPtr = (byte*)target; 
for(int i from 0 to bytesToCopy) { 
    targetPtr[i] = srcPtr[i]; 
} 
} 
+0

確かに私はまだここで少し失われています。今のところ私は代わりに文字列を解析するために辞任しました。 –

+0

文字列をbyte [] bMessage2にコピーします。 int []をbyte []に​​コピーして、メモリマッピングで使用することもできます。 – usr

+0

ありがとう、私はそれが動作するようになる道を見ていると思うが、ここに私のサブ質問です。文字列内の5kの整数を読み込み、ベクトルに追加しながらキャストしたり、ビット単位の数学を使ってバイトから生成すると、ソリューションによってどのようなパフォーマンスが得られますか? –

関連する問題