2013-04-07 7 views
5

を発生させ、私は、Win32 DLLが渡すバイト配列がAccessViolationException

__declspec(dllexport) int GetData(unsigned char* *data, int* size) 
{ 
    try 
    { 
     int tlen = 3; 
     unsigned char* tchr = new unsigned char[5]; 
     tchr[0] = 'a'; 
     tchr[1] = 'b'; 
     tchr[2] = 'c'; 

     *size = tlen; 
     *data = tchr; 

     return 1; 
    } 
    catch (char *p) 
    { 
     return 0; 
    } 
} 

とC#側の

[DllImport("MyDll.dll")] 
static extern int GetData(ref byte[] data, ref int size); 

static void Main() 
{ 
    try 
    { 
     int hr = 0; 
     byte[] gData = null; 
     int gSize = 0; 
     hr = GetData(ref gData, ref gSize); 
     Console.WriteLine(gSize); 
     for (int i = 0; i < gSize; i++) 
      Console.WriteLine((char)gData[i]); 
    } 
    catch (Exception p) 
    { 
     Console.WriteLine(p.ToString()); 
    } 
} 

を次のようにC#で呼ばれているいくつかの機能を公開して作成しようとしています私はC#コードを実行します。AccessViolationExceptionは、GetData関数で発生します。これはC++コードでは例外の兆候ですが、C++コードスニペットはエラーなしで正常に動作します。

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    unsigned char* data = NULL; 
    int size = NULL; 
    GetData(&data, &size); 
    printf("%d", size); 
    for (int i = 0; i < size; i++) 
     printf("%c,", data[i]); 
    return 0; 
} 

あなたがC#main機能およびC++ _tmainを比較すると、彼らはほとんどanaloguousているので、私はミスを犯すことがありどこ?

+0

希望すると、これが役立ちます。 http://stackoverflow.com/questions/8199874/c-sharp-and-void-pointers –

答えて

9

C++ newの呼び出しによって割り当てられた配列を返し、マーシャラがC#byte []に​​変換することを期待しています。それは起こりません。

参照でポインタを渡し、手動でマーシャリングする必要があります。あなたのP /呼び出しは次のようになります。

[DllImport("MyDll.dll")] 
static extern int GetData(out IntPtr data, out int size); 

機能は、データが配列を指すようになりますし、あなたがMarshalクラスを使用して内容を読むことができます返すとき。私はあなたがcopy it to a new byte arrayだろうと思います。

var arr = new byte[size]; 
Marshal.Copy(data, arr, 0, size); 

他のいくつかのポイント:

  1. 呼び出し規約が一致していません。ネイティブ側はcdeclで、管理対象はstdcallです。
  2. ネイティブ関数から返されたメモリを削除するには、デアロケータをエクスポートする必要があります。呼び出し元がバッファを割り当てる再設計を検討してください。
+0

ありがとうございました – anonim

+0

...またはNAtiveでCoTaskMemAlloc/g_mallocで割り当て、マネージで返されたIntPtrでMarshal.FreeCoTaskMemを使用 –

関連する問題