C# C中的问题#
从外部dll例程接收数据时遇到问题。dll用于从mirco控制器芯片读取数据。这在Delphi中工作得很好,我正在尝试让它在C#中工作 起始地址 Len:正在读取的数据的总长度 函数返回一个TData数组,其中索引为0的项包含起始值 地址,索引为1的项包含所接收数据的长度。下列的 项目(索引2及更高)包含收到的数据。如果接收操作失败,则 数组中返回的长度值设置为零C# C中的问题#,c#,arrays,dllimport,C#,Arrays,Dllimport,从外部dll例程接收数据时遇到问题。dll用于从mirco控制器芯片读取数据。这在Delphi中工作得很好,我正在尝试让它在C#中工作 起始地址 Len:正在读取的数据的总长度 函数返回一个TData数组,其中索引为0的项包含起始值 地址,索引为1的项包含所接收数据的长度。下列的 项目(索引2及更高)包含收到的数据。如果接收操作失败,则 数组中返回的长度值设置为零 [DllImport("dsio.dll", CallingConvention = CallingConvention.Std
[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;
}
首先,无需实例化
新字节[256]
,因为您正在将数据设置为Receive()
的返回结果
您应该尝试删除[return:marshallas]
属性,以查看默认编组是否有效
如果不起作用,则表示在使用UnmanagedType.LPArray
时,还应在marshallas
属性声明中设置和。我不知道您是否需要使用这些参数中的一个或两个(阅读链接文档和实验)SizeParamIndex
,如果需要,将是1
,因为第二个参数是长度
[return: MarshalAs( UnmanagedType.LPArray, SizeConst = 256, SizeParamIndex = 1 )]
附录:由于您将TData
声明为一个类型,这让我想到在C#中使用struct
也可以工作,并且如果它确实工作,它有助于隔离前两个字节:
[StructLayout( LayoutKind.Sequential )]
public struct TData {
public byte StartAddress = 0;
public byte Length = 0;
public byte[] Data = new byte[ 254 ];
}
如果您尝试使用它,我很确定您删除了return:marshallas
,默认封送应该可以工作。非常不清楚这个函数返回什么。除此之外,它不是字节[]。您是否尝试过不使用MarshalAs?你知道dll返回的是C型数组还是SafeArray吗?显示C函数原型和用任何语言调用此函数的代码片段(更好的是C)。Alex,这是原始的Delphi.pas代码“type TData=数组[0..255]字节;函数Receive(Adr,Len:integer):TData;stdcall;外部“dsio.dll”;过程TForm1.button8单击(发送方:ToObject);var数据:TData;i:integer;s:string;开始为i:=0到255 do数据[i]:=0;数据:=Receive($02,8);如果(数据[1]=0),则开始状态栏1.SimpleText:='Failed';exit;end;s:'';对于i:=1到8 do s:=s+Chr(数据[i+1]);Edit1.Text:=s;end;感谢您的帮助,我删除了新字节[256]
和[return:marshallas]
属性此行的错误中没有更改,Data=Receive(Adr,Len)
“MarshalDirectiveException未处理”“无法封送”“返回值”:无效的托管/非托管类型组合"Adr是一个内存指针,Len是接收到的数据的长度。对不起,我省略了提到LPArray
的部分。意思是如果您确实需要使用LPArray,请尝试指定SizeConst
和SizeParamIndex
的MarshalAs
属性。Joel,您有LPArry、SizeConst、Si的示例吗zeParamIndex结构?就是这样。因为我没有相同或类似的东西可以测试,所以你必须对这些部分进行一些处理,看看是否有什么东西可以工作。