次の C API があるとします。
void foo(const char ** stringArray, size_t arrayCount);
C# で PInvoke アダプターを作成したいと考えています。次のように、C# で 1 対 1 のマッピングを作成できます。
[DllImport("x.dll", ...)] // char set, etc. omitted
public static extern void foo(string[] stringArray, int arrayCount);
暗黙の 2 番目のパラメーターが必要です。
// 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 宣言が直接解決できるのか疑問に思っていました。