C#PInvoke的隐式数组长度

时间:2013-08-01 14:48:59

标签: c# pinvoke

给出以下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);

显然[MarshalAs()]部分已经组成。

目标是让C#调用代码看起来像这样:

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

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

1 个答案:

答案 0 :(得分:2)

只需创建一个包装函数:

private static extern void foo(string[] stringArray, int arrayCount);

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

这是一个更容易,更灵活的解决方案。