我有一个执行以下功能的C代码:
int Read (DWORD Address, DWORD NoOfBytes, int UnitSize, void* Buffer);
当缓冲区填充来自地址的数据时。功能'返回值为1或0表示成功或失败。
我尝试做的C#中的代码是:
private const string LibName = "Test.dll";
[DllImport(LibName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern int Read([System.Runtime.InteropServices.MarshalAs(UnmanagedType.I4), In] int Address, int NoOfBytes,
int UnitSize, [System.Runtime.InteropServices.MarshalAs(UnmanagedType.AsAny), Out] Object Buffer);
我以下列方式使用此功能:
var resultBuf = new short[40];
int returnValue = Read(parsedAddress, size, 2, resultBuf);
但结果是缓冲区仍然是40个零的缓冲区。
任何想法如何让这项工作?我做错了什么?
更多细节: C功能完美无缺。 发生的最奇怪的事情是在C#上我获得响应而不是缓冲区 - 但是在返回的值中(而不是返回0或1,它将值返回为int)
答案 0 :(得分:0)
大多数情况下,在使用DLL互操作时应该使用IntPtr。最重要的是,你甚至不需要" out"参数。 :)
如果计划仅在字节数组上使用该函数,那么当然可以使用例如byte *而不是void *,但是应该使用前面的方法。
public static extern int Read(uint Address, uint NoOfBytes, int UnitSize, IntPtr buffer)
这应该做得很好。
另外请记住,DLL导入是一项代价高昂的操作,应该避免使用,例如," read"操作可以在纯C#中的不安全代码中实现,并且可能会表现得更好(尽管在这种情况下差异可以忽略不计)。