CLR 整合程式設計模型限制
適用於:SQL ServerAzure SQL 受控執行個體
當您建置 Managed 預存程式或其他 Managed 資料庫物件時,需要考慮SQL Server執行某些程式碼檢查。 SQL Server會在資料庫第一次使用CREATE ASSEMBLY語句,以及在執行時間註冊 Managed 程式碼元件時,對 Managed 程式碼元件執行檢查。 也會在執行階段檢查 Managed 程式碼,因為在組件中,可能會有執行階段絕對無法到達的程式碼路徑。 特別是這樣提供了註冊協力廠商組件的彈性,如此一來,當組件中的不安全程式碼設計為在用戶端環境中執行,但是絕對不會在主控的 CLR 內執行時,就不會封鎖該組件。 Managed 程式碼必須符合的需求取決於元件是否已註冊為 SAFE、 EXTERNAL_ACCESS或 UNSAFE、 SAFE 是最嚴格的,如下所示。
除了對 Managed 程式碼組件所加諸的限制以外,也有授與的程式碼安全性權限。 Common Language Runtime (CLR) 支援稱為 Managed 程式碼之程式碼存取安全性 (CAS) 的安全性模型。 在此模型中,將會根據程式碼的識別來授與權限給組件。 SAFE、 EXTERNAL_ACCESS和 UNSAFE 元件有不同的 CAS 許可權。 如需詳細資訊,請參閱 CLR 整合代碼存取安全性。
CREATE ASSEMBLY 檢查
執行 CREATE ASSEMBLY 語句時,會針對每個安全性層級執行下列檢查。 如果有任何檢查失敗, CREATE ASSEMBLY 將會失敗,並出現錯誤訊息。
全域 (任何安全性層級)
所有參考的組件都必須符合下列其中一個或多個準則:
此組件已經在資料庫中註冊。
此組件是其中一個支援的組件。 如需詳細資訊,請參閱支援的程式庫.NET Framework。
您使用CREATE ASSEMBLY FROM< 位置,而且所有參考的元件及其相依性都可在位置 >> 取得 <。
您使用CREATE ASSEMBLY FROM< 位元組 ... > ,而且所有參考都是透過空格分隔的位元組來指定。
EXTERNAL_ACCESS
所有 EXTERNAL_ACCESS 元件都必須符合下列準則:
靜態欄位無法用來儲存資訊。 允許唯讀靜態欄位。
通過 PEVerify 測試。 用來檢查 MSIL 程式碼及關聯的中繼資料確實符合類型安全需求的 PEVerify 工具 (peverify.exe) 隨附在 .NET Framework SDK 中。
未使用 SynchronizationAttribute 類別的同步處理。
不會使用 Finalizer 方法。
EXTERNAL_ACCESS 元件中 不允許下列自訂屬性:
System.ContextStaticAttribute
System.MTAThreadAttribute
System.Runtime.CompilerServices.MethodImplAttribute
System.Runtime.CompilerServices.CompilationRelaxationsAttribute
System.Runtime.Remoting.Contexts.ContextAttribute
System.Runtime.Remoting.Contexts.SynchronizationAttribute
System.Runtime.InteropServices.DllImportAttribute
System.Security.Permissions.CodeAccessSecurityAttribute
System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute
System.STAThreadAttribute
System.ThreadStaticAttribute
SAFE
- 系統會檢查所有 EXTERNAL_ACCESS 元件條件。
執行階段檢查
執行階段會檢查程式碼組件是否有下列條件。 如果找到這些條件的任何一個,將不允許執行 Managed 程式碼,而且將會擲回例外狀況。
UNSAFE
從位元組陣列呼叫 System.Reflection.Assembly.Load () 方法,或不允許透過 使用 Reflection.Emit 命名空間隱含方式載入元件。
EXTERNAL_ACCESS
系統會檢查所有 UNSAFE 條件。
不允許在支援的組件清單中使用下列主機保護屬性 (HPA) 值當做註解的所有類型和方法。
SelfAffectingProcessMgmt
SelfAffectingThreading
同步處理
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
UI
如需 HPA 的詳細資訊,以及支援元件中不允許的類型和成員清單,請參閱 主機保護屬性和 CLR 整合程式設計。
SAFE
系統會檢查所有 EXTERNAL_ACCESS 條件。
另請參閱
支援的 .NET Framework 程式庫
CLR 整合程式碼存取安全性
主機保護屬性和 CLR 整合程式設計
建立組件
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應