从kernel32尝试DllImport时出现奇怪的异常

时间:2009-12-22 09:48:53

标签: c# dllimport 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:无法在DLL'kernel32'中找到名为'GetPrivateProfilestring'的入口点

为什么会这样? dll是否可能被更改(通过Windows更新或其他东西)?也许它再也找不到了,例外会不同吗?我知道这不太可能,因为我已经说过我没有任何理由,因为这一直有效并且源代码没有改变......

更新:奇怪的是,资本化有所帮助,它现在正在发挥作用。但是我仍然很好奇为什么会发生这种情况,为什么现在发生呢?我可以向你保证,它已经工作了好几个月了。

我有点害怕只是更改它并在任何地方更新我们的软件,因为错误只发生在我的机器上(据我所知),但旧的方法已经在各种PC和配置的生产中工作超过6个月。

3 个答案:

答案 0 :(得分:4)

尝试GetPrivateProfileString,使用大写字母S.

答案 1 :(得分:2)

名称GetPrivateProfileString是C ++中定义的GetPrivateProfileStringA(多字符版本)或GetPrivateProfileStringW(unicode版本)的别名。

此名称未在DLL中定义,因此您应使用DllImport的EntryPoint字段来提供函数的真实名称。使用C#中的Unicode版本。

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

答案 2 :(得分:0)

嗯...一些想法:

  • 您的进程的环境路径最近是否已更改,而kernel32可能不再出现在其中?
  • 我不认为导入区分大小写,但是你的大小写与MSDN不匹配(最后的'字符串'是大写的)。
  • 可能是ANSI / Unicode问题(就像ANSI消失了吗?) - 您可以尝试在DllImport属性上指定CharSet=CharSet.Unicode,甚至可以使用GetPrivateProfileStringW指定Unicode版本。