2016-05-19 17 views
0

C#からPInvokeを介してC関数を呼び出し、構造体へのポインタを渡す必要があります。この構造体にもポインタが含まれています。C#からC関数を呼び出し、ポインタを含む構造体を渡す

構造体は、関数宣言は、C#で

void myFunc(myStruct *a); 

に簡略化することができる

struct myStruct { 
    int myInt; 
    float *myFloatPointer; 
} 

、私はそのような

[DllImport("my_library.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern void myFunc(ref myStruct a); 

としての機能を宣言するCに簡略化することができます残念ながら、C#でポインタのパラメータを指定して構造体を宣言する方法を決定することはできません。

C関数は、floatポインタが指すメモリを割り当てず、変更するだけです。私はunsafeキーワードを使用せずにこれを解決することをお勧めします。

float []を使ってPInvokeで関数を呼び出すのに成功しましたが、ここではうまくいきません。

ありがとうございます。

+0

私はしばらくの間C#をやっていませんが、 'unsafe'キーワードはあなたが宣言してポインタを使用できると信じています – stackptr

+0

まずポインタが指しているものを理解する必要があります。スカラー?アレイ?誰がそれを割り当てるのですか?なぜそれを書きますか? –

+0

これはC++です。有効ではありません。 –

答えて

2

ポインタは本質的に安全ではありませんが、基本的な概念が使用されていても、ここではunsafeキーワードを使用する必要はありません。

あなたがのIntPtrを持つ構造体宣言してもよい:

struct myStruct 
{ 
    public int myInt; 
    public IntPtr myFloatPointer; 
} 

をそしてマーシャルメソッドとフィールドを初期化し、float配列のピニング後:

float[] data = new float[15]; 
    myStruct ms = new myStruct(); 

    GCHandle gch = GCHandle.Alloc(data, GCHandleType.Pinned); 
    ms.myFloatPointer = Marshal.UnsafeAddrOfPinnedArrayElement(data, 0); 

この方法は、あなたが利用していません安全でないキーワードの

実行中のプラットフォームによっては、ポインタのサイズと配置が異なる場合があります。構造には特定のレイアウトが必要な場合があります。

+0

ありがとうございました!これは私にとっては良い解決策になります。 – user1415865

関連する問題