System.Security.VerificationException:操作可能会破坏运行时的稳定性。 (亚音速2.2)

时间:2011-03-04 20:54:10

标签: c# exception asp.net-4.0 subsonic2.2

我最近尝试升级.net 2.0项目,它将SubSonic 2.2生成的DAL转换为Visual Studio 2010下的.NET 4.0。

项目转换没有错误,但现在我尝试启动它时收到一条相当卑鄙的错误消息。

System.Security.VerificationException: Operation could destabilize the runtime.  

at SubSonic.DataProvider.ApplyConfig(NameValueCollection config, Boolean& parameterValue, String configName) in C:\Documents and Settings\Desktop\4.0 Production\rel_1.0\server\Server.DAL\Server.DAL.SubSonic\DataProviders\DataProvider.cs:line 955
   at SubSonic.DataProvider.Initialize(String name, NameValueCollection config) in C:\Documents and Settings\Desktop\4.0 Production\rel_1.0\server\Server.DAL\Server.DAL.SubSonic\DataProviders\DataProvider.cs:line 916
   at System.Web.Configuration.ProvidersHelper.InstantiateProvider(ProviderSettings providerSettings, Type providerType)

抛出异常的代码:

    ApplyConfig(config, ref extractClassNameFromSPName, ConfigurationPropertyName.EXTRACT_CLASS_NAME_FROM_SP_NAME);

    private static void ApplyConfig(System.Collections.Specialized.NameValueCollection config, ref bool parameterValue, string configName)
    {
        if(config[configName] != null)
        {
            parameterValue = Convert.ToBoolean(config[configName]);
        }
    }

它对这里执行类似的调用,唯一的区别是它严格地是一个字符串而不是它正在操纵的布尔值。

private static void ApplyConfig(System.Collections.Specialized.NameValueCollection config, ref string parameterValue, string configName)
{
    if(config[configName] != null)
    {
        parameterValue = config[configName];
    }
}

config被定义为具有3个键的System.Collections.Specialized.NameValueCollection generateNullableProperties,connectionStringName,generatedNamespace extractClassNameFromSPName == false

EDIT1:启动错误的代码位于Global.asax的Application_Start()方法

System.Data.SqlClient.SqlDependency.Start(SystemSetting.Schema.Provider.DefaultConnectionString);

EDIT2:错误冒出来引发targetinvocation错误引用我的web.config

<SubSonicService defaultProvider="appPlan">
    <providers>
        <clear/>
        <add name="appPlan" type="SubSonic.SqlDataProvider, appPlan.Server.DAL.SubSonic" generateNullableProperties="false" connectionStringName="appPlan" generatedNamespace="appPlan.Server.DAL"/>
    </providers>
</SubSonicService>

还有其他人遇到过这样的问题吗?我可以升级到SubSonic3.x,但我认为这将是一项更大的任务。

感谢。

2 个答案:

答案 0 :(得分:3)

在直接从手工制作的IL生成装配之前,我已经看到过此异常。 .NET运行时验证程序集中的原始指令是否正确,尤其是在将程序集加载到受限上下文中时。例如,在执行方法之前,需要检查以确保将所需数量的参数加载到调用堆栈中。

即使验证失败,仍然可以加载程序集;但它只能完全信任。在部分信任方案中,您会得到“操作可能会破坏运行时的稳定性”错误。原因是如果运行时“行为不正确”,则运行时无法保证部分信任的程序集的安全操作。

您可以使用PEVERIFY工具(通过Visual Studio命令提示符提供)手动检查程序集。尝试验证所有引用的程序集以查看报告的内容。我怀疑.NET 2.0和.NET 4.0之间的验证规则发生了变化,现在导致其中一个SubSonic 2.2程序集的验证失败。

你在回应Fun Mun Pieng时提到的作弊也表明验证是个问题。

答案 1 :(得分:1)

这可以解决问题吗?

private static void ApplyConfig(System.Collections.Specialized.NameValueCollection config, ref bool parameterValue, string configName)
{
    if(config[configName] != null)
    {
        string val = config[configName];
        parameterValue = Convert.ToBoolean(val);
    }
}

如果没有,请尝试

string val = config[configName];
if (val.ToLower() == "false")
    parameterValue = false;
else
    parameterValue = true;

原始代码失败可能有两个原因。首先,早期版本的.NET(可能是1.1)存在一些类型问题。我不知道究竟是什么,但我怀疑它可能无法确定从NameValueCollection直接传递到ToBoolean的值的类型。第二种可能性是值不是“真”或“假”,而是其他东西。同样,这两个可能是也可能不是原因。我无法确定,因为我没有SubSonic 2.2。