【问题标题】:How to marshal pointer types when calling C dll function in C#在 C# 中调用 C dll 函数时如何编组指针类型
【发布时间】:2011-01-13 00:46:28
【问题描述】:

我需要调用从 dll 导入的 c 函数。我可以找到如何导入 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 { 短channel_no; 无符号字符底盘; 无符号字符槽; 无符号字符链接; 无符号字符填充; };

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

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

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

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

示例中的 int* 也是如此。

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

【问题讨论】:

    标签: marshalling


    【解决方案1】:
    [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);
    

    【讨论】:

    • 你能再具体一点吗?结构布局?你是说要编组一个指针值,你什么都不做?查看已编辑的问题...
    • 尝试在 C# 中使用struct 代替class 来处理SIGHW_ADDRESS_TYPE 类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多