如何将一个字节数组从C#传递给非托管C ++,修改它并将其传递给C#

时间:2013-03-15 19:51:10

标签: c# c++ arrays interop unmanaged

是否可以将C#中的Byte []传递给非托管C ++并在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 ++

我试图通过“uA”“c”次迭代设置“a”上的每个位置,每个位置都被定义但是当代码返回到其托管部分时,我得到一个异常告诉我内存已损坏,类似于:

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

我看到函数返回一个IntPtr,然后在托管端调用Marshal.Copy,但是我想知道是否有可能接近我上面想要实现的东西

提前感谢!

0 个答案:

没有答案