1

是否可以将 Byte[] 从 C# 传递给非托管 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 ,但我想知道是否有可能接近我在上面想要实现的目标

提前致谢!

4

0 回答 0