1

次の 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 宣言が直接解決できるのか疑問に思っていました。

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 に答える