gpt4 book ai didi

c# - MarshalAs C# 中的问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:15:54 27 4
gpt4 key购买 nike

我在从外部 dll 例程接收数据时遇到问题。 dll是从微 Controller 芯片读取数据。这在 Delphi 中工作正常,我正试图让它在 C# 中工作。

Adr:起始地址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;
}

最佳答案

首先,不需要实例化new byte[256],因为您将Data设置为Receive()的返回结果。

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

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

关于c# - MarshalAs C# 中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6586911/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com