C# 调用 WinAPI 示例集锦

需积分: 10 48 下载量 160 浏览量 更新于2024-12-12 收藏 21KB TXT 举报
"C# API大全.txt 包含了C#中使用Platform Invoke技术调用Windows API的示例,这些示例位于C:\ProgramFiles\MicrosoftVisual Studio .NET\FrameworkSDK\Samples\Technologies\Interop\PlatformInvoke\WinAPIs\CS目录下。文件涉及到的关键点包括DllImportAttribute的使用、CallingConvention的指定以及CharSet的选择。" 在C#编程中,与本地DLL进行交互是通过.NET框架提供的Platform Invoke (P/Invoke)服务实现的。这个服务允许C#代码调用非托管代码,如Windows API函数。以下是对关键知识点的详细解释: 1. DllImportAttribute:这是C#中的一个特性(attribute),用于标记静态方法,指示该方法是平台调用接口。它指定了要导入的动态链接库(DLL)名称,例如`[DllImport("user32.dll")]`,并可以包含其他属性来配置调用约定和字符串编码。 2. CallingConvention:调用约定决定了参数如何传递给被调用的函数。常见的调用约定有: - `CallingConvention.Cdecl`:这是C语言的调用约定,参数按逆序传递,由调用者清理堆栈。 - `CallingConvention.StdCall`:这是大多数Windows API函数使用的调用约定,参数按正序传递,由被调用者清理堆栈。 3. CharSet:这个属性决定了字符串参数如何编码。主要有以下几种选择: - `CharSet.Ansi`:使用ANSI编码,即基于当前系统代码页的字符集。 - `CharSet.Unicode`:使用Unicode编码,通常是UTF-16LE。 - `CharSet.Auto`:自动选择编码,根据目标操作系统(Windows NT系列使用Unicode,Windows 9x系列使用Ansi)。 4. EntryPoint:当DLL函数的名称在.NET中与默认规则不匹配时,可以使用此属性指定函数的实际入口点名称。例如,有些API函数在Unicode版本和Ansi版本中可能有不同的名称,如`GetVersionEx`和`GetVersionExW`。 5. ExactSpelling:如果设置为`true`,则要求函数名在DLL中必须完全匹配,不允许.NET框架自动添加后缀(如A或W)来区分Unicode和Ansi版本。 在实际开发中,正确使用这些属性对于成功调用Windows API至关重要。例如,如果你需要调用`MessageBox`函数,你可能会这样编写代码: ```csharp using System.Runtime.InteropServices; [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType); ``` 以上就是对C# API调用Windows API的关键知识点的详细解释,包括如何使用DllImportAttribute、指定调用约定和处理字符串编码。正确理解和应用这些概念将有助于你在C#中有效地利用非托管资源。