现在的位置: 首页 > 综合 > 正文

平台调用中的字符编码匹配

2014年02月11日 ⁄ 综合 ⁄ 共 1215字 ⁄ 字号 评论关闭

C#代码调用C++非托管代码时,使用P/Invoke方式,如果省略字符集属性,系统默认为 ANSI 字符集。

比如: C++中我们采用Unicode的方式编码处理字符,C#调用其非托管代码时就一定要显式设定Charset属性为Unicode。

 

附:MSDN中的说明。

-----------------------------------------------------------------------------------------

字符串封送处理和名称匹配

CharSet 字段接受以下值:

CharSet.Ansi(默认值)

  • 字符串封送处理

    平台调用将字符串从托管格式 (Unicode) 封送为 ANSI 格式。

  • 名称匹配

    在 DllImportAttribute.ExactSpelling 字段为 true(它是 Visual Basic 2005 中的默认值)时,平台调用将只搜索您指定的名称。例如,如果指定 MessageBox,则平台调用将搜索 MessageBox,如果它找不到完全相同的拼写则失败。

    ExactSpelling 字段为 false(它是 C++ 和 C# 中的默认值)时,平台调用将首先搜索未处理的别名 (MessageBox),如果找不到未处理的别名,则将搜索已处理的名称 (MessageBoxA)。请注意,ANSI 名称匹配行为与 Unicode 名称匹配行为不同。

CharSet.Unicode

  • 字符串封送处理

    平台调用会将字符串从托管格式 (Unicode) 复制为 Unicode 格式。

  • 名称匹配

    ExactSpelling 字段为 true(它是 Visual Basic 2005 中的默认值)时,平台调用将只搜索您指定的名称。例如,如果指定 MessageBox,则平台调用将搜索 MessageBox,如果它找不到完全相同的拼写则失败。

    ExactSpelling 字段为 false(它是 C++ 和 C# 中的默认值)时,平台调用将首先搜索已处理的名称 (MessageBoxW),如果找不到已处理的名称,则将搜索未处理的别名 (MessageBox)。请注意,Unicode 名称匹配行为与 ANSI 名称匹配行为不同。

CharSet.Auto

  • 平台调用在运行时根据目标平台在 ANSI 和 Unicode 格式之间进行选择。

 

抱歉!评论已关闭.