我今天在玩Visual Studio,做一些C#来PInvoke从Win32 API的一些东西。那是当我发现这个标题(请在新标签中打开查看原图)为什么C#将所有方法和类型标记为System.Runtime.InteropServices.Charset.Ansi?
它读取:
尽管公共语言运行库默认为System.Runtime.InteropServices.CharSet .Auto,语言可以覆盖这个默认值。例如,默认情况下,C#将所有方法和类型标记为System.Runtime.InteropServices.CharSet.Ansi。
为什么选择ANSI?从阅读马克Russinovich的Windows内部,我已阅读:
因为许多应用程序处理8位(单字节)ANSI字符串,许多接受字符串参数有两个入口点的Windows 功能:a Unicode(宽16位)版本和ANSI(窄8位)版本。 如果您调用Windows函数的缩小版,有作为输入字符串参数轻微的性能影响正处理系统和输出参数 从Unicode转换返回到 应用程序之前为ANSI之前转换为Unicode。
所以,我在正确的理解是C#的默认时PInvoking非托管代码是接受性能的影响?
编辑:
所以,如果我这样做:
[DllImport("kernel32.dll", Charset = CharSet.Auto]
public static extern bool Foo(IntPtr hHandle);
而且我们说这里面kernel32.dll中,存在FooA
和FooW
......请问C#知道哪些入门点使用? Visual Studio中的帮助文本使我认为默认情况下会选择ANSI入口点,但如果可以避免性能影响(尽管可以忽略),我们更喜欢宽版本。
感谢Hans。这让我几乎在那里,但我已经编辑我的问题一点,因为我还没有得到它。让我们忘记95/98/ME,并假设只有NT。 –
右键 - 编辑我的字符串示例。谢谢,非常有帮助。 –
你继续使我的答案无效。请不要这样做。问题中的错误代码没有任何问题。 –