發出宣告式安全性屬性

對動態組件及其型別和方法發出宣告式安全性屬性,在功能上相當於編寫對 Ilasm.exe (IL 組譯工具) 之 .permission 和 .permissionset 的宣告,或者是對 Visual Basic、C# 或 C++ 的原始程式碼套用 PermissionSetAttribute 屬性。 不過,用於儲存發出之屬性的中繼資料 (Metadata) 格式與用於儲存已編譯之屬性的格式之間具有差異存在 (視 .NET Framework 的版本而定)。

宣告式安全性的中繼資料格式

除了原始的 XML 格式之外,已在 2005 修訂版內對 ECMA 標準引入了用於儲存宣告式安全性屬性的新中繼資料格式。 如需詳細資訊,請參閱 ECMA Partition II 文件中,DeclSecurity 表格內的 PermissionSet BLOB (二進位大型物件) 描述 (2005 修訂版內的 22.11 節)。 您可以線上取得這份文件;請於MSDN參閱 ECMA C# 和通用語言基礎結構標準 以及在ECMA國際化網站上的 標準 ECMA-335 - Common Language Infrastructure (CLI)

在 .NET Framework 的所有版本中,使用反映 (Reflection) 發出所套用的宣告式安全性會以舊的中繼資料格式儲存。

在程式碼內使用 Ilasm.exe (IL 組譯工具) 編譯之宣告式安全性權限和 .NET Framework 2.0 版內的語言編譯器則會以新的格式儲存。

在程式碼內使用 Ilasm.exe (IL 組譯工具) 編譯的宣告式安全性權限及 .NET Framework 1.0 和 1.1 版內的語言編譯器會以舊的格式儲存。

發出宣告式安全性屬性

宣告式安全性屬性可以為組件、型別、方法和建構函式 (Constructor) 來發出。 如果是所有其他的成員型別 (Member Type),則會為基礎方法發出宣告式安全性。

重要

您無法藉由建立 PermissionSetAttribute 物件來發出宣告式安全性屬性,也無法使用 SetCustomAttribute 方法將它們套用到動態組件、型別或方法上。

  • 若要對動態組件發出宣告式安全性,請建立個別的 PermissionSet 物件,其中包含必要、選用和拒絕的權限。 將這些權限集合傳遞給適當之 DefineDynamicAssembly 方法的多載。 如果沒有任何權限可對分類套用,請為該參數指定 null。

    重要

    除非動態組件已儲存並重新載入至記憶體,或是除非您使用指定辨識項 (Evidence) 和必要權限之 DefineDynamicAssembly 方法的多載,並提供 Evidence 物件,否則不會使用必要、選用和拒絕的權限。如需詳細資訊,請參閱DefineDynamicAssembly

  • 若要在動態組件內為型別、方法和建構函式發出宣告式安全性,請建立 PermissionSet 物件,其中包含您想套用之每一個 SecurityAction 的權限。 使用 TypeBuilderAddDeclarativeSecurity 方法為型別套用權限、使用 ConstructorBuilderAddDeclarativeSecurity 方法為建構函式套用權限,並使用 MethodBuilderAddDeclarativeSecurity 為方法套用權限。

    注意事項注意事項

    使用 DynamicMethod 類別所定義的動態方法不支援宣告式安全性。

  • 若要為所有其他屬性和事件發出宣告式安全性,請使用 MethodBuilderAddDeclarativeSecurity 方法,對基礎方法或方法套用所需的權限集合。 例如,若要為屬性發出宣告式安全性,請對該屬性的 get 和 set 存取子 (Accessor) 方法套用宣告式安全性。

在開發會發出動態組件的程式碼時,建議您最好使用會指定辨識項和權限之 DefineDynamicAssembly 方法的多載、提供您希望此動態組件具備的辨識項,以及在 refusedPermissions 中包括 SecurityPermissionFlag.SkipVerification。 拒絕 SkipVerification 可確保會驗證 MSIL。 這項技術有一個限制,就是當它搭配需要完全信任的程式碼使用時,它也會造成系統擲回 SecurityException

請參閱

參考

DefineDynamicAssembly

ConstructorBuilder

TypeBuilder

MethodBuilder

PermissionSet