我无法从外部dll例程接收数据。 dll是从mirco-controller芯片读取数据。这在Delphi中运行良好,我试图让它在C#中工作。
Adr:起始地址 Len:正在读取的数据的总长度
该函数返回一个TData数组,其中索引为0的项包含起始值 地址和索引为1的项目包含接收数据的长度。以下 items(索引2和更高)包含收到的数据。如果接收操作失败,则 数组中返回的长度值设置为零
[DllImport("dsio.dll", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPArray)]
public static extern byte[] Receive(int Adr, int Len);
private void BtnReceive_Click(object sender, EventArgs e)
{
byte[] Data = new byte[256];
int Adr = 0x05;
int Len = 8;
Data = Receive(Adr, Len);
txtBox2.Text = Data;
}
答案 0 :(得分:1)
首先,由于您将new byte[256]
设置为Data
的返回结果,因此无需实例化Receive()
。
您应该尝试删除[return: MarshalAs]
属性,以查看默认的编组是否有效。
如果它不起作用,this documentation表示在使用MarshalAs
时,UnmanagedType.LPArray
属性声明中也应设置SizeConst
和SizeParamIndex
。我不知道您是否需要使用其中一个或两个参数(阅读链接文档和实验)。如果需要,SizeParamIndex
将为1
,因为第二个参数是长度。
[return: MarshalAs( UnmanagedType.LPArray, SizeConst = 256, SizeParamIndex = 1 )]
附录:由于您将TData
声明为类型,这让我知道在C#中使用struct
也可能有效,并且它有助于隔离前2个如果是这样的话:
[StructLayout( LayoutKind.Sequential )]
public struct TData {
public byte StartAddress = 0;
public byte Length = 0;
public byte[] Data = new byte[ 254 ];
}
如果你尝试使用它,我很确定你删除return: MarshalAs
并且默认封送应该有效。