设置不当引起的一个平台调用异常
今天开发过程中要用到一个INI文件,随即想到了Kernel32.dll中的GetPrivateProfileString()函数,然后引入相关包,写好引用函数名称开始测试,却总不能成功,弹出EntryPointNotFoundException, 具体内容为“无法在 DLL“kernel32.dll”中找到名为“GetPrivateProfileString”的入口点。”,以为名称写错,核查了好几遍,问题如故。代码如下:
反复测试了几次之后发现问题出在ExactSpeling=true上。
MSDN上这样说的:
[DllImport("kernel32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
反复测试了几次之后发现问题出在ExactSpeling=true上。
MSDN上这样说的:
如果为 false,则当 DllImportAttribute.CharSet 字段设置为 CharSet.Ansi 时,将调用附加有字母“A”的入口点名称;当 DllImportAttribute.CharSet 字段设置为 CharSet.Unicode 时,将调用附加有字母“W”的入口点名称。此字段通常由托管编译器设置。下表根据编程语言设置的默认值,说明了 CharSet 字段和 ExactSpelling 字段之间的关系。您可以重写默认设置,但须谨慎。
语言 | ANSI | Unicode | Auto |
---|---|---|---|
Visual Basic | ExactSpelling:=True | ExactSpelling:=True | ExactSpelling:=False |
C# | ExactSpelling=false | ExactSpelling=false | ExactSpelling=false |
C++ | ExactSpelling=false | ExactSpelling=false | ExactSpelling=false |
原因找到了,当CharSet=CharSet.Auto时,ExactSpeling应该设置为false,否则编译器搞不懂你要在什么地方找这个函数了,OK,就按照他说的办吧,去掉这两个属性,由编译器自己找去吧。
问题解决。