如果其中一个参数为void *,如何在C#中使用C函数?

时间:2014-08-21 09:06:59

标签: c# c

我有一个执行以下功能的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)

1 个答案:

答案 0 :(得分:0)

大多数情况下,在使用DLL互操作时应该使用IntPtr。最重要的是,你甚至不需要" out"参数。 :)

如果计划仅在字节数组上使用该函数,那么当然可以使用例如byte *而不是void *,但是应该使用前面的方法。

public static extern int Read(uint Address, uint NoOfBytes, int UnitSize, IntPtr buffer)

这应该做得很好。

另外请记住,DLL导入是一项代价高昂的操作,应该避免使用,例如," read"操作可以在纯C#中的不安全代码中实现,并且可能会表现得更好(尽管在这种情况下差异可以忽略不计)。