我最近尝试升级.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,但我认为这将是一项更大的任务。
感谢。
答案 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。