1

C# からアンマネージ C++ に Byte[] を渡し、C++ 内で変更してその値を C# に戻すことは可能ですか? 何かのようなもの:


C#:
[DllImport("MyDll.dll")]
public static extern bool UnmanagedFunction(ref Byte[] a, short b, ref ulong c);
...
bool success;
Byte[] a = new Byte[65];
ulong c = 0;
success = UnmanagedFunction(ref a, (short)a.Length, ref c);

C++:
extern "C" __declspec(dllexport) BOOL WINAPI UnmanagedFunction(
    __inout_ecount(b)       PBYTE          a, 
    __in                    INT16          b,
    __out                   DWORD          c
) {
    BOOL success = FALSE;
    PBYTE uA;
    OVERLAPPED d;
    ...
    success = ReadFile(
        readHandle,
        uA,
        b,
        &c,
        &d);
   if ( success ) {
       a = uA;
   }
   free(uA);
   return success;
}

「UnmanagedFunction」の呼び出し後に C# で変数「a」を読み取ろうとすると、配列の最初の位置しか表示されません。C コードについては申し訳ありません。C++ でのポインターと参照は初めてです。

各位置を「a」に設定して「uA」「c」回反復しようとしましたが、各位置が定義されていますが、コードがマネージドセクションに戻ると、メモリが破損していることを示す例外が発生します。

for ( int i = 0; i < c; ++i )
    a[i] = uA[i];

関数が IntPtr を返し、マネージド側で Marshal.Copy を呼び出すのを見てきましたが、上記で達成しようとしていることに近いものが可能かどうか疑問に思っていました

前もって感謝します!

4

0 に答える 0