gpt4 book ai didi

c# - 在 C# 中将结构指针作为参数传递

转载 作者:行者123 更新时间:2023-12-01 14:42:12 27 4
gpt4 key购买 nike

我需要包含一个 .dll,其中包含以下 C/C++ 函数原型(prototype)和结构定义:

typedef struct
{
unsigned short us1;
unsigned short us2;
unsigned short data[16];
} myStruct;
int myFunc(myStruct *MYSTRUCT);
为了使用这个函数,我创建了一个新类:
static class DLL
{
public struct MyStruct
{
public ushort us1;
public ushort us2;
public ushort[] data;
public PDPORT(ushort[] temp1, ushort temp2, ushort temp3)
{
us1 = temp2;
us2 = temp3;
data = temp1;
}
};
[DllImport("PDL65DLL.dll")]
public static extern int mvb_PutPort(ref MyStruct CommData);
}
在我的主类中,我初始化结构变量并像这样调用函数:
    DLL.MyStruct communicationData = new DLL.MyStruct(new ushort[16], new ushort(), new ushort());
DLL.MyFunc( ref communicationData);
但是,这似乎不起作用。该函数正在传递一些东西,但不是正确的值,我建议它与指针使用有关。也许 struct* 与 ref struct 不同...有人可以解释问题所在吗?

最佳答案

您可能需要指定结构的打包(取决于 C++ 代码使用的默认打包)。您还可以使用 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] 为编码指定一个固定大小的数组。 .
您也不需要 C# 实现来使用 struct事实上,对于相当大的数据量,我建议使用一个类。
这是一个例子:

[StructLayout(LayoutKind.Sequential, Pack=4)]
public sealed class MyStruct
{
public ushort us1;
public ushort us2;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public ushort[] data;

public MyStruct(ushort[] temp1, ushort temp2, ushort temp3)
{
us1 = temp2;
us2 = temp3;
data = new ushort[16];
Array.Copy(temp1, data, Math.Min(temp1.Length, data.Length));
}
}
请注意构造函数如何确保数组的大小正确。您必须始终确保数组的大小与 SizeConst 匹配。宣言。
通过这些更改,Marshaller 应该会为您处理好事情。

关于c# - 在 C# 中将结构指针作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63593102/

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