2017-10-02 11 views
2

未加工のテクスチャデータをTexture2D(バイト配列)からアンマネージドC++コードに渡そうとしています。Unity C#のバイト配列をC++プラグインに渡します

[DllImport("LibName", CallingConvention = CallingConvention.Cdecl)] 
static extern IntPtr ProcessData(byte[] data); 

C++:

extern "C" { 
    __declspec(dllexport) void ProcessData(uint8_t *data) { 
     //sizeof(data) is always 8 
    } 
} 

私は何をしていますC#のコード配列の長さは、しかし、ネイティブメソッドのC++のsizeof 'は常に返し8.

C#の宣言では、およそ1,5kkです間違っている? C++コードにメモリを追加しないで配列を渡す方法はありますか?あなたの現在のコードを実行する必要があり

+2

'のはsizeof(データ)は' **あなたに**ポインタのサイズを伝え、あなたがの大きさを推測することはできませんポインタから配列を指している場合は、それを別々に渡す必要があります – UnholySheep

答えて

2

いくつかのこと:

。あなたが言及したUnholySheepとして、別のパラメータにC++プラグインに配列のサイズを送信する必要があります。

。配列をC++側に送る前に、配列を固定する必要もあります。これはfixedキーワードまたはGCHandle.Alloc機能で実行されます。

。C++関数にvoid戻り値の型がある場合、C#関数もvoid戻り値型を持つ必要があります。

以下は、コードの修正版です。追加のメモリ割り当ては実行されません。

のC#:

[DllImport("LibName", CallingConvention = CallingConvention.Cdecl)] 
static extern void ProcessData(IntPtr data, int size); 

public unsafe void ProcessData(byte[] data, int size) 
{ 
    //Pin Memory 
    fixed (byte* p = data) 
    { 
     ProcessData((IntPtr)p, size); 
    } 
} 

C++:

extern "C" 
{ 
    __declspec(dllexport) void ProcessData(unsigned char* data, int size) 
    { 
     //sizeof(data) is always 8 
    } 
} 
関連する問題