帮帮我--为什么这段代码在.NET 4.0下运行时会导致VerificationException?
public T parseEnum<T>(string value, T defaultValue) {
//Removing the following lines fixes the problem
if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
return defaultValue;
}我在.net 2.0程序集上运行peverify,得到以下消息:
this ImageResizer.Util.Utils::parseEnumT]偏移量0x0000000A调用的‘
’参数必须是调用方法的'this‘参数。
这会导致在中等信任下运行代码时出现VerificationException: Operation could destabilize the runtime消息。
我已经读过所有关于堆栈溢出的类似帖子了,没有一个适用于这段代码。
泛型有没有什么新东西会导致这段代码在某种程度上无效?
发布于 2011-08-03 11:05:10
该错误的根本原因是IsEnum的签名更改。
在.NET 2.0 (和3.0)中,IsEnum wasn't a virtual method
public bool IsEnum { get; }发出以调用它的程序集是:
call instance bool [mscorlib]System.Type::get_IsEnum()在.NET 4.0中,IsEnum is a virtual method
public virtual bool IsEnum { get; }以下是4.0的相同装配线:
callvirt instance bool [mscorlib]System.Type::get_IsEnum()你得到的错误是added in peverify just before the 2.0 release,当一个虚拟方法被非虚拟调用时会发出警告。
现在,peverify加载您的代码,加载.NET 4.0,然后检查您的代码。由于您的代码以非虚拟方式调用(.NET 4.0)虚拟方法,因此会显示错误。
有人会认为,既然是在.NET 2.0版本上构建,这应该没问题,它将加载.NET 2.0CLR进行检查。看起来并非如此。
编辑:
为了检查这一点,我下载了.NET 2.0's SDK并尝试了其中的peverify。它正确地验证了代码。
因此,信息似乎是这样的:使用与您代码的目标框架相匹配的peverify。
解决方案:
_Type interface似乎为此提供了解决方案:
if (((_Type)typeof(T)).IsEnum) ...文档说它被设计为从非托管代码中调用,但作为一个接口的副作用,它提供了一个稳定的(虚拟)方法来调用。
我已经确认,无论你的目标是2.0还是4.0,它都可以与peverify一起工作。
https://stackoverflow.com/questions/6919808
复制相似问题