Я протестировал метод StringArrayToMultiString, используя функцию ChangeServiceConfig () для изменения зависимостей службы Windows, и он прекрасно работает для нулевой, одной и многих строк.
Тем временем я разработал решение для декодирования многорядной строки, полученной от вызова API. Например, функция SCardListReaders () возвращает несколько строк имен устройств чтения PC / SC. Я объявил это как:
[DllImport("winscard.dll", CharSet = CharSet.Auto)]
static extern int SCardListReaders(
IntPtr context,
string groups,
char[] readers,
ref uint readersLen
);
Обратите внимание, что параметр reader, который возвращает многорядную строку, объявлен как char []. Возвращаемое значение легко анализируется и преобразуется в набор строк:
static string[] MultiStringToArray(
char[] multistring
)
{
List<string> stringList = new List<string>();
int i = 0;
while (i < multistring.Length)
{
int j = i;
if (multistring[j++] == '\0') break;
while (j < multistring.Length)
{
if (multistring[j++] == '\0')
{
stringList.Add(new string(multistring, i, j - i - 1));
i = j;
break;
}
}
}
return stringList.ToArray();
}