[C#] 操作可能會破壞運行時的穩定?


Answers

我發現這個條目,同時尋找我自己的解決方案,“操作可能會破壞運行時”。 雖然上面的協方差/對比方差建議看起來非常有趣,但最終我發現通過運行我的單元測試,打開了代碼覆蓋率並設置了AllowPartiallyTrustedCallers程序集屬性,我得到了相同的錯誤消息。

刪除AllowPartiallyTrustedCallers屬性導致我的測試運行良好。 我也可以關閉代碼覆蓋,使他們運行,但這不是一個可以接受的解決方案。

希望這可以幫助其他人,使其到這個網頁試圖找到解決這個問題。

Question

我在理解這裡出現的問題上有點麻煩。 我有一些代碼使用LINQ從數據庫中提取記錄,並將它們放入一個投射到界面的對像中。 它看起來有點像這樣:

public IEnumerable<ISomeObject> query()
{
    return from a in dc.SomeTable
           select new SomeObject
           {
             //Assign various members here
           } as ISomeObject;
}

當我測試這個時,我把返回的IEnumerable放到一個名為results的變量中,並運行這一行:

Assert.AreEqual(EXPECTED_COUNT, results.Count());

當這個運行時,我得到一個System.Security.VerificationException:“操作可能會破壞運行時。

我在這裡找到了解決方案,這是:

var results = from a in dc.SomeTable
              select new SomeObject
              {
                //Assign various members here
              } as ISomeTable;
return results.OfType<ISomeObject>();

這工作,但我無法理解這裡發生了什麼。 為什麼我首先得到異常,以及上面的代碼行是如何解決的呢? MSDN文檔似乎表明,這是一個類型安全的問題,但我沒有看到以前的代碼類型不安全的地方。

更新更多的信息,我發現了。 第一個例子工作,如果我使返回類型IQueryable。 這對於發生了什麼問題有了更多的了解 ,但是我仍然對此感到困惑。 為什麼編譯器不讓我把IEnumerable轉換成IQueryable?




我有同樣的問題,但與繼承我定義了一個類在程序集A和一個子類在程序集B後,我加入下面的屬性到程序集A,解決了問題:

[assembly: SecurityRules(SecurityRuleSet.Level1, SkipVerificationInFullTrust = true)]



我用類似的代碼來看到這個錯誤。

IEnumerable<Table> records = (from t in db.Tables
                              where t.Id.Equals(1)
                              select t).ToList();

這個看似無害的代碼是從頁面調用的UserControl方法的一部分。 在.NET4開發環境中沒有問題,但是,當這個站點被預先編譯並部署到.NET3.5上的服務器時,我得到了這個錯誤。

我懷疑這與這個事實有關,控件被編譯成一個單獨的DLL,並且在這個.NET安全博客中描述的框架之間的安全變化

我的解決方案:在.NET4上運行實時站點




我發現OfType在使用linq到sql時有一些令人討厭的副作用。 例如,以前在對數據庫運行查詢之後評估的linq部分被轉換為SQL。 這失敗了,因為這些部分沒有SQL等效。 我最終使用.Cast而不是似乎也解決了這個問題。




我猜,Linq to Sql在轉換成sql語句時可能不支持強制轉換。