【问题标题】:Why do my tests fail with System.Security.VerificationException?为什么我的测试因 System.Security.VerificationException 而失败?
【发布时间】:2011-04-24 11:03:35
【问题描述】:

我正在将我的一个项目从 VS2008 迁移到 VS2010。现在我在运行测试工具时将解决方案中的所有项目都转换为 .NET 4.0(客户端配置文件),几乎所有测试都失败了,但出现以下异常:

System.Security.VerificationException: 操作可能会破坏稳定 运行时。

我无法确定为什么会发生此异常。当我在调试模式下运行测试时,测试运行良好。

整个解决方案可供下载here

谁能指出我正确的方向?

【问题讨论】:

  • 您能否确认应用程序是在 CLR 4.0 下运行的?解决方案中的所有项目是否都配置为面向 .NET 4.0?
  • this 有什么帮助吗?
  • @Darin 库及其支持应用程序在 .NET 4 客户端配置文件下运行(它们不需要更多)。测试项目在 .NET 4 下运行,无法重新定位它。
  • @adrianbanks:不,我没有使用 LINQ、表达式或委托。
  • @Dave,是否有一些与此异常相关的堆栈跟踪,以便您可以在代码中查明发生这种情况的确切位置?您是否还更新了Microsoft.VisualStudio.QualityTools.UnitTestFramework 的引用以在您的单元测试项目中使用v10.0.0.0

标签: .net visual-studio-2010 .net-4.0 mstest


【解决方案1】:

第一步:针对已构建的程序集(测试和应用程序)运行peverify tool。它可能会为您提供一些有助于查明问题的输出。

第二步:你能给我们堆栈跟踪或异常输出吗?有一次我实际上在 .net 2 中看到了一个错误,这是一个编译器错误——我不得不稍微修改代码以使调用编译为虚拟调用而不是直接调用。给我们堆栈和有问题的代码行会很有帮助。

我要指出的一点是,在 4.0 客户端配置文件下运行的应用与在 3.5 下运行的应用具有不同的安全行为。您可以尝试将 [assembly: SecurityRules(SecurityRuleSet.Level1)] 添加到您的 assemblyinfo.cs 以在“旧样式”规则下运行以帮助缩小范围。

【讨论】:

  • 在 4.0(不是客户端配置文件)下运行不能解决问题。此外,所有代码都可以在问题中的链接中下载。
【解决方案2】:

问题似乎与您激活的代码覆盖率有关。禁用代码覆盖可以解决问题。您可以在您的 AssemblyInfo.cs 中添加以下内容:

[assembly: SecurityRules(SecurityRuleSet.Level1, SkipVerificationInFullTrust = true)]

并重新激活代码覆盖率。

【讨论】:

  • 好电话!我稍后会检查一下 VS2010 的代码覆盖率发生了什么变化。
【解决方案3】:

我在从 TFS2010 升级到 TFS2012 构建服务器的过程中寻找一个非常相似的问题的答案时遇到了这个问题。

我们的项目已经以 .Net 4.0 为目标,并且在升级之前进行了单元测试。

由于 .Net 4.5 是就地升级,Microsoft 引入的 .Net 4.5 错误可能会在 .Net 4.0 目标项目中导致此问题。它可能与 SecurityRules 答案有关,但在框架 dll 内部(如 Microsoft.VisualStudio.QualityTools.UnitTestFramework)。

对于我们来说,下面链接的修补程序修复了“操作可能会破坏运行时的稳定性”。原本可以工作的单元测试中的异常。

http://support.microsoft.com/kb/2748645

我希望这可以节省其他人很多时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-23
    • 2010-10-04
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多