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

时间:2010-02-04 10:57:39

标签: marshalling

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

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

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

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

struct HW_ADDRESS_TYPE {    short channel_no;    unsigned char chassis;    unsigned char槽;    unsigned char链接;    unsigned char filler; };

我可以发现,对于Marshal这种类型我需要描述结构布局......

[StructLayout(LayoutKind.Sequential)]    公共类HW_ADDRESS_TYPE    {       short channel_no;       字节机箱;       字节槽;       字节链接;       字节填充;    };

[StructLayout(LayoutKind.Sequential)]    公共课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;    };

但似乎有问题。我这样做了吗?

示例中的int *相同。

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

1 个答案:

答案 0 :(得分:0)

[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);