给出以下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声明是否可以直接解决?
答案 0 :(得分:2)
只需创建一个包装函数:
private static extern void foo(string[] stringArray, int arrayCount);
public static void foo(string[] stringArray) {
foo(stringArray, stringArray.Length);
}
这是一个更容易,更灵活的解决方案。