强制转换导致"Operation could destabilize the runtime"在一个 ASP.NET 4.0 盒子上而不是另一个盒子上



这里是我在.NET2.0中使用多年的一个简单的反序列化方法的一部分。CCD_ 1是一个不受约束的类型参数。

protected virtual T ItemFromString(string s) {
    if (typeof(T).IsPrimitive ||
        typeof(T) == typeof(string)) {
        try {
            // needed for string, too: compiler doesn't allow (T)s
            return (T)Convert.ChangeType(s, typeof(T));
        }
        catch (Exception ex) {
            // stuff
        }
    }
}

我将应用程序池更改为在4.0中运行,一切都很好—;直到我将其部署到远程服务器。在那里,我在线上得到了"操作可能会破坏运行时的稳定">

return (T)Convert.ChangeType(s, typeof(T));

(实际上,报告的行是该方法的结束括号,但我已经将其缩小到该行。(

如果我将运行时更改回2.0,问题就会消失。

运行时版本均为4.0.30319。该应用程序在其他方面是相同的,包括web.config。两个应用程序都使用共享应用程序池并在完全信任下运行。大概是另一个环境在影响它,但我不知道该怎么弄清楚。

我所发现的一切都涉及Reflection.Emit或协方差,我没有使用它。

有线索吗?

谢谢。

既然这个问题已经被0x80次查看了,我将发布我最近使用的解决方案,因为我再也不能推迟迁移到.NET 4了。

您必须在生成中以.NET 4平台为目标,并设置以下程序集属性。

using System.Security;
// Needed to enable generic deserialization in partial trust.
[assembly: SecurityRules(SecurityRuleSet.Level1)]

我曾评论说我处于完全信任模式,但我一定错了。这只是部分受信任环境中的问题。

最新更新