我正在使用我自己的实现 ICustomMarshaler 的编组器来使用本机(非托管)dll C 函数。
在 MarshalNativeToManaged 函数中,我确实看到了来自 dll 端的正确结果。问题是 MarshalNativeToManaged 返回的对象没有“使用”。带有 (In, Out) 参数的调用函数中的对象没有改变。
(看起来这与之前在这里讨论过的问题完全相同“C#:具有自定义编组器的对象在 PInvoke 调用后不包含数据”) C#:具有自定义编组器的对象在 PInvoke 调用后不包含数据
简单的类:
[StructLayout(LayoutKind.Sequential)]
class CMA {
public int a;
char b;
public char get_b() { return b; }
}
该函数的签名如下所示:
[DllImport("first.dll", EntryPoint = "hack")]
public static extern int hack([In, Out, MarshalAs(UnmanagedType.CustomMarshaler,
MarshalTypeRef=typeof(ZMarshal))] CMA cma);
在主要的某个地方,我这样称呼它:
int retcode = hack(cma);
在 MarshalNativeToManaged 中,我确实看到了 dll 函数调用的正确结果。
public object MarshalNativeToManaged(IntPtr pNativeData)
{
// everything is fine with pNativeData;
// but let us even say I ignore it
// and return the object in the following way:
CMA cma = new CMA();
cma.a = 999;
return cma; // this will be lost. I mean cma object in the main will not be changed
}
我在这里做错了什么?只是一个简短的说明:我确实想知道如何使用 CustomMarshaler 而不是“其他方式”来处理它:)