云卷云舒

Lordeo's Collections

 

设置不当引起的一个平台调用异常

今天开发过程中要用到一个INI文件,随即想到了Kernel32.dll中的GetPrivateProfileString()函数,然后引入相关包,写好引用函数名称开始测试,却总不能成功,弹出EntryPointNotFoundException, 具体内容为“无法在 DLL“kernel32.dll”中找到名为“GetPrivateProfileString”的入口点。”,以为名称写错,核查了好几遍,问题如故。代码如下:

[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);


反复测试了几次之后发现问题出在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,就按照他说的办吧,去掉这两个属性,由编译器自己找去吧。

问题解决。

posted on 2008-03-22 13:53  Lordeo  阅读(2423)  评论(3编辑  收藏  举报

导航