【问题标题】:Implicit array length with C# PInvoke使用 C# PInvoke 隐式数组长度
【发布时间】:2013-08-01 14:48:59
【问题描述】:

给定以下 C API:

void foo(const char ** stringArray, size_t arrayCount);

我想在 C# 中为它创建一个 PInvoke 适配器。我可以在 C# 中进行一对一的映射:

[DllImport("x.dll", ...)]  // char set, etc. omitted
public static extern void foo(string[] stringArray, int arrayCount);

我想要一个隐式的第二个参数。

// Psuedo-code
[DllImport("x.dll", ...)]
public static extern void foo(string[] stringArray, 
                              [MarshalAs(stringArray.Length)] int arrayCount);

显然 [M​​arshalAs()] 部分是虚构的。

目标是 C# 调用代码如下所示:

string[] list = { "x", "y" };
foo(list);

我可以围绕 PInvoke 做一个简单的包装,但我想知道这是否是最好的方法,或者我的 PInvoke 声明是否可以直接解决?

【问题讨论】:

    标签: c# pinvoke


    【解决方案1】:

    只需创建一个包装函数:

    private static extern void foo(string[] stringArray, int arrayCount);
    
    public static void foo(string[] stringArray) {
        foo(stringArray, stringArray.Length);
    }
    

    这是一个更简单、更灵活的解决方案。

    【讨论】:

    • 别忘了[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)]
    猜你喜欢
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2016-07-29
    相关资源
    最近更新 更多