gpt4 book ai didi

c# - 使用 C# 调用返回结构数组的非托管 dll 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:50 27 4
gpt4 key购买 nike

我有一个使用 C++ 编写的非托管 dll。我能够从我的 C# 应用程序中轻松调用一些函数。但是有一个功能让我很痛苦:)

C++

问题出在日志参数上。它应该反射(reflect)为 Data_Struct 类型的数组:

typedef struct
{
unsigned int id;
unsigned short year;
unsigned char month;
unsigned char day;
unsigned char hour;
unsigned char min;
unsigned char sec;
unsigned char status;
}Data_Struct;

int Read_Stored_Data(HUNIT pUnitHandle, int option, int updateFlag,
int maxEntries, unsigned char *log)

C#(我的转换)

public struct Data_Struct
{
public uint id;
public ushort year;
public byte month;
public byte day;
public byte hour;
public byte min;
public byte sec;
public byte status;

}

[DllImport("SData.dll", EntryPoint = "Read_Stored_Data")]
public static extern int Read_Stored_Data(int pUnitHandle, int option,
int updateFlag, int maxEntries, ref Data_Struct[] log);

请假设我正在传递具有正确值的 pUnitHandleoptionupdateFlagmaxEntries。问题是最后一个参数(log):

Data_Struct[] logs = new Data_Struct[1000];
res = Read_Stored_Data(handle, 1, 0, 1000, ref logs); // This should work but it
// causes the application
// to terminate!

有什么想法吗?

最佳答案

尝试使用 PInvoke 属性。

具体来说,将布局应用于结构:

[StructLayout(LayoutKind.Sequential)]
public struct Data_Struct
{
public uint id;
public ushort year;
public byte month;
public byte day;
public byte hour;
public byte min;
public byte sec;
public byte status;
}

并将编码属性应用于参数,同时删除 ref:

[DllImport("SData.dll", EntryPoint = "Read_Stored_Data")]
public static extern int Read_Stored_Data(int pUnitHandle, int option,
int updateFlag, int maxEntries, [MarshalAs(UnmanagedType.LPArray), Out()] Data_Struct[] log);

看看是否有帮助,相应地进行调整。

关于c# - 使用 C# 调用返回结构数组的非托管 dll 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8375033/

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