2009-12-22 9 views
1

Я использую эту функцию уже несколько месяцев, однако сегодня она перестала работать. Я не могу представить, почему, и я ничего не решаю, поэтому, если у вас есть идеи, пожалуйста, расскажите!Weird exception при попытке DllImport from kernel32

Я загрузка функции таким образом:

[DllImport("kernel32")] 
private static extern int GetPrivateProfilestring(string section, string key, string def, StringBuilder retVal, int size, string filePath); 

, а затем я пытаюсь использовать его таким образом:

StringBuilder temp = new StringBuilder(255); 

int i = GetPrivateProfilestring(Section, Key, "", temp, 255, strPath); 
return temp.ToString(); 

как сказал это работало в течение веков, однако теперь он бросает это исключение:

System.EntryPointNotFoundException: Не удается найти точку входа с именем 'GetPrivateProfileString' в DLL 'kernel32'

Зачем это произошло? Возможно ли, что dll было изменено (обновлением Windows или чем-то)? Может быть, его просто невозможно найти, иначе исключение будет отличаться? Я знаю, что это маловероятно, однако, как я уже сказал Im решение ничего из этого, так как не всегда работал и исходный код не был изменен ...

Update: Как ни странно, капитализация помогла, швы работать Теперь. Однако мне все еще интересно узнать, почему это произошло, и почему это произошло сейчас? Я могу заверить вас, что он работал уже несколько месяцев.

Я немного боюсь просто менять его и обновлять наше программное обеспечение повсюду, поскольку ошибка произошла только на моей машине (насколько я знаю, так или иначе), однако старый метод работает в производстве на разных ПК и конфигурациях более 6 месяцев.

ответ

4

Попробуйте GetPrivateProfileString вместо этого, с капиталом С.

+0

Как указано в разделе обновления вопроса, это действительно помогло. Однако я не могу понять, как это работает до сих пор, если это действительно было причиной ошибки. –

+0

Возможно, у вас было поле «EntryPoint», в котором записано имя функции? Я не знаю, что сказать. Вы можете попробовать посмотреть старый код, который работает и разобрать его, чтобы увидеть, как он был объявлен. – Blindy

0

Хммм ... Несколько мыслей:

  • ли путь среды вашего процесса изменилось в последнее время, где kernel32 не может быть на нем больше?
  • Я не думаю, что импорт чувствителен к регистру, но ваш корпус не соответствует MSDN (окончательная «строка» заглавная).
  • Может быть проблема с ANSI/Unicode (например, ANSI один ушел?) - вы можете попробовать указать CharSet=CharSet.Unicode по атрибуту DllImport или даже указать версию Unicode точно с помощью GetPrivateProfileStringW.
2

Имя GetPrivateProfileString является псевдонимом для GetPrivateProfileStringA (multi char version) или GetPrivateProfileStringW (версия Unicode), определенной на C++.

Это имя не указано в DLL, поэтому вы должны использовать поле EntryPoint в DllImport, чтобы дать истинное имя функции. Используйте версию Unicode из C#.

[DllImport("kernel32", EntryPoint="GetPrivateProfileStringW")] 
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); 
+0

В этом случае точка входа не требуется. См. Замечания http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset.aspx: «Использовать [...] перечисление CharSet, чтобы указать [...], какое имя точки входа для вызова (точное имя или имя, оканчивающееся на «A» или «W»). Членом перечисления по умолчанию для C# и Visual Basic является CharSet.Ansi, а элемент перечисления по умолчанию для C++ - CharSet.None, что эквивалентно CharSet.Ansi. " –

 Смежные вопросы

  • Нет связанных вопросов^_^