在 C# 中调用 C dll 函数时如何封送指针类型

发布于 2024-08-19 21:50:17 字数 838 浏览 4 评论 0原文

我需要调用从 dll 导入的 ac 函数。我可以找到如何导入 api 函数,但我不确定如何封送函数期望作为参数的所有类型。特别是指针类型。

示例函数签名可能是...

Result_Type get_signal_value( SIG* sig, char* name, int *value );

其中 SIG 是包含各种项目的结构。例如。 结构体SIG { 字符 sig_id[16]; int sig_ptr; HW_ADDR_TYPE hw_info; };

结构 HW_ADDRESS_TYPE { 短通道号; 未签名的字符底盘; 无符号字符槽; 无符号字符链接; 无符号字符填充符; };

我可以发现,要编组这种类型,我需要描述结构布局...

[StructLayout(LayoutKind.Sequential)] 公共类 HW_ADDRESS_TYPE { 短通道号; 字节机箱; 字节槽; 字节链接; 字节填充符; };

[StructLayout(LayoutKind.Sequential)] 公开课SIG { 公共常量 LEN_SID = 16; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LEN_SID)] 公共字符串 sig_id; int sig_ptr; HW_ADDRESS_TYPE hw_info; };

但这里似乎有问题。我这样做正确吗?

示例中的 int* 也是如此。

任何帮助都会很棒。干杯!

I need to call a c function imported from a dll. I can find how to import the api function but I am unsure how to marshal all the types the function expects as paramters. Particularly pointer types.

Example function signature might be...

Result_Type get_signal_value( SIG* sig, char* name, int *value );

where SIG is a sturcture containing various items. eg.
struct SIG
{
char sig_id[16];
int sig_ptr;
HW_ADDR_TYPE hw_info;
};

and

struct HW_ADDRESS_TYPE
{
short channel_no;
unsigned char chassis;
unsigned char slot;
unsigned char link;
unsigned char filler;
};

I can find that to Marshal this type I need to describe the structure layout...

[StructLayout(LayoutKind.Sequential)]
public class HW_ADDRESS_TYPE
{
short channel_no;
byte chassis;
byte slot;
byte link;
byte filler;
} ;

[StructLayout(LayoutKind.Sequential)]
public class SIG
{
public const int LEN_SID = 16;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = LEN_SID)]
public string sig_id;
int sig_ptr;
HW_ADDRESS_TYPE hw_info;
};

but seem to have problems here. have I done this correctly?

Same for the int* in the example.

Any help would be great. Cheers!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世俗缘 2024-08-26 21:50:17
[StructLayout(LayoutKind.Sequential)]
struct SIG
{
    // describe the fields here
}

[DllImport("lib.dll")]
static extern bool get_signal_value(SIG sig, string name, float value);

你可能会这样称呼:

SIG sig = new SIG();
sig.Field1 = value1;
sig.Field2 = value2;
bool result = get_signal_value(sig, "abc", 1.5f);
[StructLayout(LayoutKind.Sequential)]
struct SIG
{
    // describe the fields here
}

[DllImport("lib.dll")]
static extern bool get_signal_value(SIG sig, string name, float value);

Which you might call:

SIG sig = new SIG();
sig.Field1 = value1;
sig.Field2 = value2;
bool result = get_signal_value(sig, "abc", 1.5f);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文