1

给定以下 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 声明是否可以直接解决?

4

1 回答 1

2

只需创建一个包装函数:

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

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

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

于 2013-08-01T14:50:57.133 回答