1、Intro尝试
C#中的API就是Win32API,即平台调用(P/Invoke),一种调用非托管的DLL中函数的.net特性。
Windows API 是做为 Windows 操做系统一部分的动态连接库 (DLL)。当难以本身编写等效的过程时,可使用它们来执行任务。
在代码中使用 Windows API 的好处在于它们能够节省开发时间,由于它们包含许多已经编写好的、等待使用的有用函数。缺点是在发生故障时,Windows API 可能难以处理而且不可挽回。
尝试的程序:

Windows API 表示一种特殊类别的互操做性。Windows API 不使用托管代码,不具有内置类型库,它使用的数据类型与 Visual Studio 中所用的数据类型不一样。因为这些差异,且 Windows API 不是 COM 对象,因此与 Windows API 和 .NET Framework 的互操做是经过使用平台调用 (PInvoke) 来完成的。平台调用是一种服务,它使托管代码可以调用 DLL 中实现的非托管函数。。。
平台调用是一种服务,它使托管代码可以调用 DLL 中实现的非托管函数
如调用系统的 API 或与 COM 对象打交道,经过 System.Runtime.InteropServices 命名空间
为了从托管代码中调用非托管的DLL中函数,咱们要建立一个P/Invoke包装。
其实用来建立P/Invoke包装的语法与建立托管方法的声明语法本质上是同样的。惟一不一样是P/Invoke包装不包含函数体,而只有方法 名、返回值类型和参数信息。
2、Beep程序
Win32 API 集很是庞大。他们没有足够的资源为全部 Win32 API 编写托管接口、加以测试并编写文档,所以只能优先处理最重要的部分。函数
许多经常使用操做都有托管接口,可是还有许多完整的 Win32 部分没有托管接口。测试
C#调用P/Invoke是完成这一任务的最经常使用方法。要C#调用P/Invoke,要编写一个描述如何调用函数的原型,而后运行时将使用此信息进行调用。ui
另外一种方法是使用 Managed Extensions to C++ 来包装函数。。spa
在Beep的尝试中:操作系统
能够查到:.net
MSDN 中的定义,我发现它具备如下原型:xml
若用C# 来编写这一原型,须要将 Win32 类型转换成相应的 C# 类型。因为 DWORD 是 4 字节的整数,所以咱们可使用 int 或 uint 做为 C# 对应类型。对象
又因为 int 是 CLS 兼容类型(能够用于全部 .NET 语言),以此比 uint 更经常使用,bool 类型与 BOOL 对应。blog
程序实现:接口
成功实现了随机生成的Beep音播放~