Marshal在C#中提问

时间:2011-07-05 18:05:24

标签: c# arrays dllimport

我无法从外部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;
     }

1 个答案:

答案 0 :(得分:1)

首先,由于您将new byte[256]设置为Data的返回结果,因此无需实例化Receive()

您应该尝试删除[return: MarshalAs]属性,以查看默认的编组是否有效。

如果它不起作用,this documentation表示在使用MarshalAs时,UnmanagedType.LPArray属性声明中也应设置SizeConstSizeParamIndex。我不知道您是否需要使用其中一个或两个参数(阅读链接文档和实验)。如果需要,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并且默认封送应该有效。