C #: передача массива строк в C ++ DLL - PullRequest
3 голосов
/ 11 ноября 2009

Я пытаюсь передать некоторые строки в массиве в C ++ DLL.

Функция C ++ DLL:

extern "C" _declspec(dllexport) void printnames(char** ppNames, int iNbOfNames)
{
    for(int iName=0; iName < iNbOfNames; iName++)
    {
        OutputDebugStringA(ppNames[iName]);
    }
}

И в C # я загружаю функцию следующим образом:

[DllImport("MyDLL.dll", CallingConvention = CallingConvention.StdCall)]
static extern void printnames(StringBuilder[] astr, int size);<br>

Затем я настраиваю / вызываю функцию следующим образом:

List<string> names = new List<string>();
names.Add("first");
names.Add("second");
names.Add("third");

StringBuilder[] astr = new StringBuilder[20];
astr[0] = new StringBuilder();
astr[1] = new StringBuilder();
astr[2] = new StringBuilder();
astr[0].Append(names[0]);
astr[1].Append(names[1]);
astr[2].Append(names[2]);

printnames(astr, 3);

Используя DbgView, я вижу, что некоторые данные передаются в DLL, но выводит мусор вместо «first», «second» и «третьего».

Есть какие-нибудь подсказки?

1 Ответ

5 голосов
/ 11 ноября 2009

Используйте String [] вместо StringBuilder []:

[DllImport("MyDLL.dll", CallingConvention = CallingConvention.StdCall)]
static extern void printnames(String[] astr, int size);

List<string> names = new List<string>();
names.Add("first");
names.Add("second");
names.Add("third");

printnames(names.ToArray(), names.Count);

MSDN имеет дополнительную информацию о маршалинге.

...