C#(8)--P/Invoke

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

  1. BOOL Beep{  
  2. DWORD dwFreq, // 聲音頻率  
  3. DWORD dwDuration  // 聲音持續時間  
  4. }  

若用C# 來編寫這一原型,須要將 Win32 類型轉換成相應的 C# 類型。因爲 DWORD 是 4 字節的整數,所以咱們可使用 int 或 uint 做爲 C# 對應類型。對象

又因爲 int 是 CLS 兼容類型(能夠用於全部 .NET 語言),以此比 uint 更經常使用,bool 類型與 BOOL 對應。blog

程序實現:接口

成功實現了隨機生成的Beep音播放~
相關文章
相關標籤/搜索