朗渡

朗,明也。渡,济也,使脱愚蒙 Lordeo's Collections

导航

与我联系

搜索

 

常用链接

留言簿

我管理的小组

我的标签

随笔分类(20)

收藏

积分与排名

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

今天开发过程中要用到一个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 朗渡 阅读(1759) 评论(3)  编辑 收藏 网摘 所属分类: C#

评论

#1楼  2008-03-22 14:55 毁于随      

呵呵.现在很少人用INI了吧.   回复  引用  查看    

#2楼  2008-03-22 22:27 Shiherpoo      

extern 很少用的,不熟悉   回复  引用  查看    

#3楼  2008-06-21 15:40 小猴子      

虽然这里用的不多,其它地方可用得多哦。!
顶个   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-22 16:11 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: