2010-12-22 115 views
11

我實現這個功能:GetSystemPowerStatusEx & GetSystemPowerStatusEx2如何知道本地方法是安全/不安全的?

根據這篇文章MSDN,我應該創建一個根據我將使用功能命名的類,但我的問題是:我怎麼能知道在哪個班,我應該把GetSystemPowerStatusEx & GetSystemPowerStatusEx2?

我迷路了...

感謝您的幫助。

[編輯]我的問題是:這三個類名中的哪一個對我來說是好的(NativeMethods/SafeNativeMethods/UnsafeNativeMethods)?

這些方法應該是以下的一類:

NativeMethods - 此類不 抑制疊公益金非託管代碼 許可。 (System.Security.SuppressUnmanagedCodeSecurityAttribute 不得應用於此類。) 此類適用於可在任何地方使用的方法,因爲將執行堆棧行走 。

SafeNativeMethods - 此類 禁止非託管 代碼權限的堆棧散步。 (System.Security.SuppressUnmanagedCodeSecurityAttribute 應用於此類。)此類 適用於任何人都可以安全調用的方法。這些 方法的調用者不需要執行完整的安全審查,以確保 的使用是安全的,因爲 方法對於任何調用者都是無害的。

UnsafeNativeMethods - 此類 禁止非託管 代碼權限的堆棧散步。 (System.Security.SuppressUnmanagedCodeSecurityAttribute 應用於此類。)此類 適用於可能有 危險的方法。任何這些方法的調用者 必須執行完整的安全審查 請確保使用是安全的 因爲沒有堆棧散步將 執行。

回答

8

這是一個非常愚蠢的警告,並最終非生產性。但保持開心很簡單,只需將一個靜態類添加到名爲NativeMethods的項目中,並將[DllImport]聲明放入其中即可。無需單獨的課程。聲明他們內部

請注意,您不能在模擬器上調用這些函數,測試它們需要在設備上運行它。爲了讓您的程序在模擬器中可以調試,請務必使用#ifdef DEBUG來包裝調用它們的代碼。

2

只要將它們聲明爲靜態類中的靜態方法;這是標準方法。

編輯:像評論者指出的那樣,它們也可以放置在非靜態類中。從本質上講,只要你的Win32方法是具有DLLImport屬性的靜態外部函數,它們幾乎可以在任何類中使用。

+0

它們也可以放在非靜態類中。 – 2010-12-22 16:48:07

+0

當然,它們可以放在任何地方。我所看到的標準方法是靜態的,但我想真正的答案是,沒關係。 – 2010-12-22 16:49:51

+1

我同意,我也總是爲他們寫封裝函數。以便我可以在需要時輕鬆替換或修改它們。 – Bobby 2010-12-22 16:57:06

0

把它們放到你要用它們作爲靜態方法的類中,然後用普通的方法環繞它們,這樣你就不會打擾其他應用程序,並且存在一些涉及extern的概念。

我使用這種方法,它永遠不會失敗。

編輯:

檢查了這一點:

http://pinvoke.net/search.aspx?search=GetSystemPowerStatusEx