#c# #.net #ini
#c# #.net #ini
Вопрос:
Я хочу получить данные из моего ini-файла, который выглядит следующим образом:
[UI]
visibility=hidden
size=medium
с помощью следующего кода:
string section = "UI";
string key = "size";
string defaultValue "-";
string value = GetValueFromIni(section, key, defaultValue);
-----------------------------------------------------------------
this.filePath = @"C:Users0372test.ini";
public string GetValueFromIni(string section, string key, string defaultValue = "")
{
string value = string.Empty;
int i = GetPrivateProfileStringW(section, key, defaultValue, value, 255, this.filePath);
return value ?? defaultValue;
}
[DllImport("kernel32")]
private static extern int GetPrivateProfileStringW(string section, string key, string defaultValue, string value, int size, string filePath);
Но это не сработает.
Я всегда получаю значение по умолчанию.
Кто-нибудь знает решение этой проблемы?
Приветствия
Ответ №1:
По крайней мере, ваша подпись p / invoke неверна.
lpReturnedString
является указателем на буфер, в который должен быть записан результат. Строки C # неизменяемы, поэтому маршаллер не собирается изменять вашу value
переменную. Вместо этого вы должны использовать StringBuilder
:
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(
string section,
string key,
string defaultValue,
StringBuilder value,
int size,
string filePath);
Вызовите его с помощью, например
var value = new StringBuilder(255);
int ret = GetPrivateProfileString(section, key, defaultValue, value, value.Capacity, this.filePath);
// TODO: Check 'ret'
return value.ToString();
Это всегда стоит проверять http://pinvoke.net для вдохновения, хотя отнеситесь к подписям там с недоверием.
Я не тестировал это с вашим вводом, поэтому не могу гарантировать, что это работает. Если кто-то другой предложит полное решение, пожалуйста, примите его ответ вместо моего.
Комментарии:
1. Спасибо, но это тоже не дает мне значения. Значение — это просто пустая строка.
2. Ну что ж, это, по крайней мере, часть проблемы. Обновлено для уточнения.
3. Какое значение вы видите
ret
?4. Неважно, я забыл удалить «W» из GetPrivateProfileStringW. Теперь это работает 🙂
5. Да, маршаллер хорош в выборе правильного варианта A / W