我有一个[AllowPartiallyTrustedCallers]类库,包含System.DataAnnotations.ValidationAttribute的子类型.该库用于WCF服务的合同类型.
在.NET 2/3.5中,这很好用.但是,从.NET 4.0开始,在Visual Studio调试器中运行服务的客户端会导致异常" 类型的违反继承安全规则:'(我的ValidationAttribute的子类型)'.派生类型必须与基类型的安全可访问性匹配或者不太容易访问. "(System.TypeLoadException)
仅当满足以下所有条件时,才会出现错误:
ValidationAttribute的子类位于AllowPartiallyTrustedCallers程序集中
反射用于检查属性
Visual Studio托管过程已启用(项目属性,调试选项卡上的复选框)
基本上,在Visual Studio.NET 2010中:
创建一个新的Console项目,
添加对"System.ComponentModel.DataAnnotations"4.0.0.0的引用,
写下面的代码:
.
using System; [assembly: System.Security.AllowPartiallyTrustedCallers()] namespace TestingVaidationAttributeSecurity { public class MyValidationAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute { } [MyValidation] public class FooBar { } class Program { static void Main(string[] args) { Console.WriteLine("ValidationAttribute IsCritical: {0}", typeof(System.ComponentModel.DataAnnotations.ValidationAttribute).IsSecurityCritical); FooBar fb = new FooBar(); fb.GetType().GetCustomAttributes(true); Console.WriteLine("Press enter to end."); Console.ReadLine(); } } }
按F5即可获得异常!
按Ctrl-F5(无需调试即可启动),一切正常,无异常...
奇怪的是,根据您运行程序的方式(F5或Ctrl + F5),ValidationAttribute将是或将不是安全关键.如上面代码中的Console.WriteLine所示.但话说回来,这似乎与其他属性(和类型?)一起发生.
现在问题......
为什么在从ValidationAttribute继承时会出现此行为,但在从System.Attribute继承时却没有?(使用Reflector我在ValidationAttribute类或它的程序集中找不到特殊设置)
我该怎么做才能解决这个问题?如何保持MyValidationAttribute继承自AllowPartiallyTrustedCallers程序集中的ValidationAttribute而不将其标记为SecurityCritical,仍然使用新的.NET 4级别2安全模型并仍使用VS.NET调试主机(或其他主机)?
非常感谢!鲁迪