2011-03-04 74 views
10

我最近试图升级一个.net 2.0项目,它的DAL由SubSonic 2.2生成到Visual Studio 2010下的.NET 4.0。System.Security.VerificationException:操作可能会破坏运行时。 (Subsonic 2.2)

转换没有错误,但现在我得到一个相当邪恶的项目错误信息,当我尝试启动它。

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]; 
    } 
} 

配置被定义为与System.Collections.Specialized.NameValueCollection 3个键 generateNullableProperties,的connectionStringName,generatedNamespace extractClassNameFromSPName ==假

EDIT1:揭开序幕错误的代码在Global.asax的Application_Start()方法

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

EDIT2:错误泡出异常触发一个targetinvocation错误referening我的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

我已经升级了一些网站,使用SubSonic 2.0.3(w /很多定制)从2.0 - > 3.5 - > 4.0没有任何问题。我没有去掉一些提供者,我从来没有,因为我有他们不支持x64的问题。 – Zachary 2011-03-08 01:43:39

+0

我剥离了Oracle,MySql和SqlLite,认为可能存在冲突,但我遇到了同样的问题。 – 2011-03-08 15:35:10

+0

配置系统使用反射非常严重。当访问该属性时,似乎配置的提供程序的一些代码被Jited。在这一点上,运行时检查生成的代码,并告诉你:不要这种类型是不好的。要找到根本原因,您需要在SubSonic.SqlDataProvider中使用Reflector来查看。 – 2011-03-14 18:48:53

回答

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。

+2

我试过这个,但错误实际上发生在:if(config [configName]!= null),而不是在布尔转换。我骗了,直到我可以弄清楚并将其添加到AssemblyInfo.cs文件:: [程序集:SecurityRules(SecurityRuleSet.Level1,SkipVerificationInFullTrust = true)]我发现提到一个.net4与.net2透明度问题与不可靠/不安全的代码和.net4.0的安全规则添加行到文件告诉它使用2.0规则(从我可以告诉) – 2011-03-11 21:19:26

3

我以前在直接从手工制作IL生成装配体时看到过这个例外。 .NET运行时验证程序集中的原始指令是否正确,特别是在将程序集加载到受限上下文中时。例如,在执行方法之前,有一项检查可确保将所需数量的参数加载到调用堆栈中。

即使验证失败,装配仍可以加载;但它只能以完全信任的方式运行。在部分信任的情况下,你会得到这个“操作可能会破坏运行时”的错误。原因是如果运行时不能“正确地”运行,那么运行时不能保证部分信任的程序集安全运行。

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

你提到的回答Fun Mun Pieng的作弊行为也表明验证是问题。

相关问题