gpt4 book ai didi

c# - 为什么此行在 .NET 4 下运行时会导致 VerificationException?

转载 作者:IT王子 更新时间:2023-10-29 04:42:42 26 4
gpt4 key购买 nike

帮帮我,为什么这段代码在 .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 并收到以下消息:

ImageResizer.Util.Utils::parseEnum[T]][offset 0x0000000A] The 'this' parameter to the call must be the calling method's 'this' parameter.

在中等信任下运行代码时,这会导致 VerificationException: Operation could destabilize the runtime 消息。

我已经阅读了所有关于堆栈溢出的类似帖子,但没有一篇适用于此代码。

是否有一些新的泛型会导致此代码以某种方式无效?

最佳答案

错误的根本原因是 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.0 CLR 进行检查。好像不是。

编辑:

为了检查这一点,我下载了 .NET 2.0's SDK并在那里尝试了 peverify。它正确地验证了代码。

因此消息似乎是这样的:使用与代码的目标框架相匹配的 peverify

解决方案:

似乎_Type interface对此提供了解决方案:

if (((_Type)typeof(T)).IsEnum) ...

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

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

关于c# - 为什么此行在 .NET 4 下运行时会导致 VerificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6919808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com