- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
帮帮我,为什么这段代码在 .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/
每当我在附加调试器的情况下运行以下任一单元测试时,我都会在 FluentValidation 中得到一个 VerificationException此时的代码(如有必要,稍后将发布整个堆栈跟踪): a
我使用 .Net 4.5.2 和 Entity Framework 6.1.3 创建了一个基本的 WCF 数据服务和 Entity Framework。数据库中只有一张表。 配置如下: public
为什么此代码会抛出“System.Security.VerificationException:操作可能会破坏运行时的稳定性。”? MethodInfo mi = typeof(TypedRefere
我读过这个post我想使用 ControllerExtensions.RedirectToAction 方法。但是我有 System.Security.VerificationException 说:
我正在使用 IL 生成创建一个简单的反序列化器方法,该方法从 Lucene 文档中提取字符串并设置引用类型对象 (POCO) 的属性或字段。 每当我尝试运行生成的方法时,我都会收到 Verificat
我收到“操作可能会破坏运行时异常”。我瞪大了眼睛,看起来异常与在运行时加载的冲突程序集有关。所以,这里有几件事 相同的源代码在我同事的机器上运行。 我查看并搜索了对 NewtonSoft.Json.d
似乎当我使用 OpenCover 检测程序集时, 组件与 SecurityTransparent属性(似乎还有 AllowPartiallyTrustedCallers)将抛出 Verificatio
我正在制作一个声音合成程序,用户可以在其中通过基于节点的合成、创建振荡器、滤波器等来创建自己的声音。 程序将节点编译成中间语言,然后通过 ILGenerator 和 DynamicMethod 将其转
我需要在运行时使用 TypeBuilder 创建一个类型。这种类型应该实现一个特定的接口(interface),以便可以在编译时统一处理这种动态类型的实例。 该接口(interface)应返回一个对象
我正在将我的一个项目从 VS2008 迁移到 VS2010。现在,当我运行测试工具时,我将解决方案中的所有项目都转换为 .NET 4.0(客户端配置文件),几乎所有测试都失败了,但出现以下异常: Sy
帮帮我,为什么这段代码在 .NET 4.0 下运行时会导致 VerificationException? public T parseEnum(string value, T defaultValu
我正在使用 FluentValidation 3.4.6,我的项目的目标框架是 .net 4。我已经彻底检查了我的解决方案,以确保没有引用旧版本的 FluentValidation。 我相信这个版本的
在尝试重构 MVC 4 应用程序期间,我的代码出现了这样的扭曲,我从 Subversion 恢复了整个东西。但是,现在,当我运行代码时出现以下异常,并且无法弄清楚如何消除它。 Server Error
我想通过委托(delegate)调用某些方法,但得到了 VerificationException。我正在使用以下代码: internal delegate void Delegete_add
我遇到了 MVC3 RC 的奇怪行为。 我使用单元测试创建了默认的 Internet 应用程序,并且我的计算机上的所有单元测试都失败了。所有测试都有错误"System.Security.Verif
我正在开发一个 Android 应用程序,它使用我的 REST 后端。后端在 JBoss 实例上运行,该实例通过 Keycloak 进行保护。自从我将 Keycloak 从 1.0.7 更新到 2.1
我试图在事件发生时触发一个 Action ,忽略事件参数(至少现在)。我通过反射找到事件,然后创建一个匹配预期签名的动态方法(不能保证它只是发件人/EventArgs) 并从那里尝试调用该操作。 //
我有一个将构造函数包装在动态工厂方法中的方法: static Func ToFactoryMethod(this ConstructorInfo ctor) where TResult : c
我最近尝试将一个由 SubSonic 2.2 生成 DAL 的 .net 2.0 项目升级到 Visual Studio 2010 下的 .NET 4.0。 项目转换没有错误,但现在我在尝试启动它时收
我有类似的代码 using FluentValidation; public class FreeformValidator : AbstractValidator { public Free
我是一名优秀的程序员,十分优秀!