[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:“操作可能會破壞運行時的穩定性。”

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

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中定義了一個類,在我將以下屬性添加到程序集A後,在程序集B中定義了一個子類,問題解決了:

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



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




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




我用類似的代碼遇到了這個錯誤;

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

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

我懷疑這與控件被編譯成一個單獨的DLL以及框架之間的安全性更改這一事實有關,如本.NET安全博客中所述

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




Links