c#中怎么访问调用 c++写的dll,含结构体、指针、地址

c#中如何访问调用 c++写的dll,含结构体、指针、地址
最近新遇到一个问题,是关于访问USB芯片的,需要向USB芯片读、写数据。
访问USB驱动的函数是用C++写的,已经生成.DLL文件,该DLL文件在VC中调用正常,但是本人不熟悉C#,在C#中调用总是失败。
C++ DLL中的函数代码如下:
extern "C" int _stdcall DataOut(HANDLE hDevice,BYTE pipenum1, BYTE *data, DWORD &lenBytes)
{
BULK_TRANSFER_CONTROL bulkControl;
bulkControl.pipeNum=pipenum1;
  if(!DeviceIoControl (hDevice,
IOCTL_EZUSB_BULK_WRITE, 
&bulkControl,
sizeof (BULK_TRANSFER_CONTROL),
data,
1024,
&lenBytes,
NULL))
return 0;
else return 1;
}
在c#中
 [DllImport("UsbDll.dll")]
  public static extern int EzusbShortdataOut(IntPtr hDevice, uint pipenum1, out byte[] data, Int32 lenBytes);
 private void button1_Click(object sender, EventArgs e)
  {
  for (int i = 0; i < 256; i++)
  {
  data[i] = (byte)i;
  }
  EzusbShortdataOut(this.Handle, (uint)0x00, out data, (Int32)256);
  }

但是多次试验仍然不成功,请指教,小弟不胜感激!



------解决方案--------------------
... out byte[] data, Int32 lenBytes)肯定不对。

C#中的out byte[]是传入一个指针的引用,而不是C++中的byte指针。
C++中的DWORD &lenBytes是引用。

先这样改:
int DataOut(IntPtr hDevice, byte pipenum1, byte[] data, ref int lenBytes);
------解决方案--------------------
IntPtr hDevice我理解为设备的句柄,一般是通过OpenDevice之类获取的,而不是你传入的this.Handle。

this.Handle是窗口的句柄。

------解决方案--------------------
友情up!
------解决方案--------------------
C# code

(1)不单要导入dll,还要加入节点。
[DllImport("UsbDll.dll", EntryPoint = "DataOut"))]  
public static extern int DataOut(IntPtr hDevice, byte pipenum1, byte[] data, ref int lenBytes);
(2)IntPtr hDevice理解为设备的句柄,一般是通过OpenDevice之类获取的,而不是你传入的this.Handle。
 可能是你要显示Panel控件或其他控件的handle,或者是通过另一个方法初始化设备如OpenDevice之类返回的Handel.
(3) 具体的错误提示是什么,请写出来,这样别人才好帮你

------解决方案--------------------
up,mark
------解决方案--------------------
探讨
...
如果我想获得设备的句柄,在C#中用OpenDevice怎么实现呢,请指教
...

------解决方案--------------------
探讨
byte[] data = new byte[1024];

[DllImport("UsbDll.dll", EntryPoint= "DataOut")]
public static extern int DataOut(IntPtr hDevice, byte pipenum1, byte[] data, ref int lenBytes);
int lenBytes=1024;
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1024; i++)
{
d…

------解决方案--------------------
个人提一点吧,这个前段时间做过一点点
我没有使用byte[],而是使用了StringBuilder以及IntPtr Marshal.AllocCoTaskMem/Marshal.PtrToStringAnsi
因为程序要求尽量不用unsafe的方法^^

参考而已,我那时候做是不知道函数代码的,材料只说是有这个api T.T

至于你是写usb芯片,这个没怎么接触过,只是有点arm的理解。
hDevice应该可以用枚举或者字符串的吧
如果是代表特定设备的话,一般是GUID+名称