首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.NET 4下运行时,为什么此行会导致VerificationException?

在.NET 4下运行时,为什么此行会导致VerificationException?
EN

Stack Overflow用户
提问于 2011-08-03 07:07:55
回答 1查看 3.7K关注 0票数 19

帮帮我--为什么这段代码在.NET 4.0下运行时会导致VerificationException?

代码语言:javascript
复制
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消息。

我已经读过所有关于堆栈溢出的类似帖子了,没有一个适用于这段代码。

泛型有没有什么新东西会导致这段代码在某种程度上无效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-03 11:05:10

该错误的根本原因是IsEnum的签名更改。

在.NET 2.0 (和3.0)中,IsEnum wasn't a virtual method

代码语言:javascript
复制
public bool IsEnum { get; }

发出以调用它的程序集是:

代码语言:javascript
复制
call instance bool [mscorlib]System.Type::get_IsEnum()

在.NET 4.0中,IsEnum is a virtual method

代码语言:javascript
复制
public virtual bool IsEnum { get; }

以下是4.0的相同装配线:

代码语言:javascript
复制
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似乎为此提供了解决方案:

代码语言:javascript
复制
if (((_Type)typeof(T)).IsEnum) ...

文档说它被设计为从非托管代码中调用,但作为一个接口的副作用,它提供了一个稳定的(虚拟)方法来调用。

我已经确认,无论你的目标是2.0还是4.0,它都可以与peverify一起工作。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6919808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档