【发布时间】:2014-03-06 09:27:18
【问题描述】:
我今天在玩 Visual Studio,做一些 C# 来 PInvoke 来自 Win32 API 的一些东西。那是我注意到这个标题的时候(请在新标签中打开以查看完整尺寸)
上面写着:
虽然公共语言运行时默认值为 System.Runtime.InteropServices.CharSet.Auto,但语言可能会覆盖此默认值。例如,默认情况下,C# 将所有方法和类型标记为 System.Runtime.InteropServices.CharSet.Ansi。
为什么选择 ANSI?通过阅读 Mark Russinovich 的 Windows Internals, 我已经阅读:
由于许多应用程序处理 8 位(单字节)ANSI 字符串,许多 Windows 接受字符串参数的函数有两个入口点:Unicode(宽,16 位)版本和 ANSI(窄,8 位)版本。 如果调用窄版本的 Windows 函数,则会对性能产生轻微影响,因为输入字符串参数在处理之前会转换为 Unicode 由系统和输出参数在返回之前从 Unicode 转换为 ANSI 应用程序。
那么,我是否正确理解 C# 在 PInvoking 非托管代码时的默认设置是接受这种性能影响?
编辑:
所以如果我这样做:
[DllImport("kernel32.dll", Charset = CharSet.Auto]
public static extern bool Foo(IntPtr hHandle);
假设在 kernel32.dll 内部,存在一个 FooA 和一个 FooW ... C# 如何知道要使用哪个入口点? Visual Studio 中的帮助文本让我认为它会默认选择 ANSI 入口点,但如果可以避免性能影响(但可以忽略不计),我们更喜欢宽版本。
【问题讨论】: