1

我已经使用这个特殊功能几个月了,但是今天它停止工作了。我无法想象为什么,我不排除任何可能性,所以如果你有任何想法,请告诉!

我正在以这种方式加载函数:

[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 个多月.

4

3 回答 3

4

请尝试GetPrivateProfileString使用大写字母 S。

于 2009-12-22T09:53:31.880 回答
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);
于 2009-12-22T09:57:44.190 回答
0

嗯...一些想法:

  • 您的进程的环境路径最近是否发生了变化,kernel32 可能不再存在?
  • 我认为导入不区分大小写,但您的大小写与 MSDN 不匹配(最后的“字符串”大写)。
  • 可能是 ANSI/Unicode 问题(比如 ANSI 消失了?)- 您可以尝试指定CharSet=CharSet.UnicodeDllImport 属性,甚至可以使用 GetPrivateProfileStringW 精确指定 Unicode 版本。
于 2009-12-22T09:54:42.230 回答