2010-06-16 131 views
42

我有一個從Exception繼承的類。在.NET 4中,我開始收到一個運行時錯誤:繼承安全規則 - SecurityRuleSet.Level2

Inheritance security rules violated while overriding member: MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.

我覺得這個問題是由我重寫GetObjectData這個事實引起的。

我知道解決這個問題一個答案是設置SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

這不是一個可以接受的答案,我想知道如何解決這個問題,而不必放寬默認的安全規則在.NET 4.

回答

32

馬克GetObjectDataSecurityCriticalAttribute,因爲它適用於Exception.GetObjectData。重寫的成員應該具有相同的安全可訪問性(嚴重,安全關鍵或透明)。

閱讀Security Changes in the .NET Framework 4Security Transparent Code, Level 2從MSDN以獲取更多信息。

爲了避免所有潛在的安全運行時異常,與安全規則集啓用代碼分析。您將得到可能對應於運行時錯誤的靜態分析警告。

+3

很酷,工作!我實際上已經嘗試過這種方法,但我在課堂級別而不是在成員級別應用了該屬性。 – 2010-06-16 19:27:27

+1

我想在InitializeLifeTimeService上做這件事,它不想工作,得到相同的錯誤。 – adriaanp 2011-01-17 14:10:04

+0

我該怎麼做?你能顯示一些代碼嗎? – brainmurphy1 2013-06-08 03:47:31

11

關於在共享託管環境中,可以充分信任的應用程序此錯誤。在您部署應用程序時,您經常會覆蓋web.config。在IIS,當您更改信任設置的東西比默認不同,您的網絡配置部分修飾:

<system.web> 
    <trust level="Full" /> 
<system.web> 

複製過程中部署往往覆蓋此設置一個新的web.config文件,但是IIS管理仍將顯示該網站稱爲「完全信任」,實際上該網站運行在無論您的共享主機提供商(通常是中等)的默認信任級別。

你會看到這個錯誤,做什麼我沒有 - 揣摩爲什麼你會看到它,即使你知道該網站是在完全信任運行,當在現實中,事實並非如此。解決方案是在部署之前修改您的web配置,或者使用IIS Admin將站點設置爲不同的信任級別(例如高),應用它,然後將其設置回滿。這樣做會重新插入必要的配置文件信息並以完全信任的方式重新啓動應用程序池。

[assembly: System.Security.AllowPartiallyTrustedCallers] 

刪除它解決了我的問題,而無需切換到SecurityRuleSet.Level1:

17

當我打電話說有AllowPartiallyTrustedCallers屬性的組件有這個問題。

+0

爲了編譯DevExpress源代碼,這是一個快速且髒的修補程序。 – 2013-05-29 23:52:18

+4

這將包含在AssemblyInfo.cs中,至少對我來說是這樣。擺脫它解決了它對我來說也是如此。 – 2014-08-01 19:32:49

1

對於我來說,這個問題是與log4net的圖書館。我下載了源代碼,並將項目文件添加到我的解決方案中,以便我可以進入外部庫。但是,log4net需要爲條件編譯定義的NET_4_0符號。默認情況下,它定義了NET_1_0。我進入log4net項目屬性並將NET_1_0更改爲NET_4_0,並解決了此問題。

旁白:也許我沒有按照最佳做法將庫包括在我的項目中。如果是這樣的話,我會歡迎不同方式的反饋,以及每個選擇的利弊。我目前的想法是,如果出現錯誤,能夠看到圖書館的源代碼將幫助我瞭解圖書館期望的內容,這將幫助我清除錯誤。另外,看到其他人如何編寫源代碼是沒有價值的學習經驗。基本上,我試圖按照Jeff Atwood的建議發現here。但是如果有更好的方法來實現這一目標,我就會全神貫注。