2009-10-29 75 views
4

在SQL Server 2008上,我試圖註冊一個似乎只能引用supported libraries的程序集。下面是我使用註冊程序集的T-SQL代碼:爲什麼SQL Server不能將我的程序集註冊爲SAFE?

create assembly MySpatial from 'c:\Spatial.dll' 

這將導致以下錯誤:

Msg 6509, Level 16, State 31, Line 1 An error occurred while gathering metadata from assembly 'Spatial' with HRESULT 0x80004005.

不過,如果我添加with permission_set=unsafe,那麼SQL將執行命令成功。我怎樣才能找出錯誤發生的原因,或爲什麼我的程序集必須註冊爲不安全?

+0

我與我的程序集有完全相同的問題。沒有任何非''readonly'靜態字段/屬性,它只引用了安全的'mscorlib.dll'和'System.dll',都是v2。我試圖將有限的一部分類複製到一個單獨的文件中,並進行編譯,這是有效的,所以有一些特定的東西阻止它被接受爲安全的。 – 2010-01-28 12:54:36

+0

我發現我的程序集有問題,它在'GetEnumerator()'方法中有一些lambda表達式,所以我將它們轉換爲常規方法+'new Func <>'(將它們轉換爲匿名方法並沒有幫助) 。這使我可以將程序集添加到SQL Server而不會出現錯誤。我仍然不清楚爲什麼這些lambda表達式導致了這種情況(它們可以在SQL Server之外編譯和運行)。 – 2010-01-28 14:19:15

回答

1

當設置的權限不安全時,SQL將不會驗證您的程序集的元數據。

嘗試應用KB 941256的修補程序或應用CU4 for SP2。 Altough與您得到的E_FAIL不同,HRESULT可能是修復程序解決此問題的方法。

+0

當然,據我所知,當權限設置爲不安全時,SQL只會讓它通過。但是,我試圖找出我的組件是不是被認爲是安全的? 另外,您提供的鏈接僅適用於SQL Server 2005,不適用於2008。 – 2009-11-15 05:28:20

2

我遇到了同樣的情況,經過一番調查,我認爲這是因爲編譯器對lambda表達式進行了優化。從lambda表達式創建委託有一些開銷。我認爲在第一次訪問lambda時,它必須懶惰地初始化一個包含委託的隱藏靜態字段,以便在將來的調用中重用已經構建的委託。

我認爲這是因爲如果lambda捕獲任何變量,它不會導致安全問題。這是有道理的,如果它捕獲變量,每次調用它時都需要創建一個不同的委託,但是如果lambda是完全獨立的,那麼爲了提高效率,它可以緩存它。

Microsoft確實在SQL 2008中修復了這個問題,但他們不會在SQL 2005中修復它,所以如果需要支持現有的SQL 2005安裝,它只需要消除「靜態優化」lambdas,而不是所有的在整個集會中的lambda。

相關問題