1、Intro嘗試
C#中的API就是Win32API,即平臺調用(P/Invoke),一種調用非託管的DLL中函數的.net特性。
Windows API 是做爲 Windows 操做系統一部分的動態連接庫 (DLL)。當難以本身編寫等效的過程時,可使用它們來執行任務。
在代碼中使用 Windows API 的好處在於它們能夠節省開發時間,由於它們包含許多已經編寫好的、等待使用的有用函數。缺點是在發生故障時,Windows API 可能難以處理而且不可挽回。
嘗試的程序:
![](http://static.javashuo.com/static/loading.gif)
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音播放~