C# C中的问题#

C# C中的问题#,c#,arrays,dllimport,C#,Arrays,Dllimport,从外部dll例程接收数据时遇到问题。dll用于从mirco控制器芯片读取数据。这在Delphi中工作得很好,我正在尝试让它在C#中工作 起始地址 Len:正在读取的数据的总长度 函数返回一个TData数组,其中索引为0的项包含起始值 地址,索引为1的项包含所接收数据的长度。下列的 项目(索引2及更高)包含收到的数据。如果接收操作失败,则 数组中返回的长度值设置为零 [DllImport("dsio.dll", CallingConvention = CallingConvention.Std

从外部dll例程接收数据时遇到问题。dll用于从mirco控制器芯片读取数据。这在Delphi中工作得很好,我正在尝试让它在C#中工作

起始地址 Len:正在读取的数据的总长度

函数返回一个TData数组,其中索引为0的项包含起始值 地址,索引为1的项包含所接收数据的长度。下列的 项目(索引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;
     }

首先,无需实例化
新字节[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结构?就是这样。因为我没有相同或类似的东西可以测试,所以你必须对这些部分进行一些处理,看看是否有什么东西可以工作。