【问题标题】:Generating .coverage file programmatic way with Visual Studio 2010使用 Visual Studio 2010 以编程方式生成 .coverage 文件
【发布时间】:2011-02-11 02:51:08
【问题描述】:

我需要以编程方式生成 .coverage 文件。 This post 解释了一个 C# 代码,如下所示。

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using Microsoft.VisualStudio.Coverage;
using Microsoft.VisualStudio.Coverage.Analysis;

// You must add a reference to Microsoft.VisualStudio.Coverage.Monitor.dll

namespace Microsoft.VisualStudio
{
       class DumpProgram
       {
              static void Main(string[] args)
              {
                    Process p = new Process();
                    StringBuilder sb = new StringBuilder("/COVERAGE ");
                    sb.Append("hello.exe");
                    p.StartInfo.FileName = "vsinstr.exe";
                    p.StartInfo.Arguments = sb.ToString();
                    p.Start();
                    p.WaitForExit();
                     // TODO: Look at return code – 0 for success
                     // A guid is used to keep track of the run
                    Guid myrunguid = Guid.NewGuid();
                    Monitor m = new Monitor();
                    m.StartRunCoverage(myrunguid, "hello.coverage");
                    // Complete the run
                    m.FinishRunCoverage(myrunguid);

不幸的是,当我编译这段代码时,我得到了以下错误。

bin2xml.cs(26,22): error CS0246: The type or namespace name 'Monitor' could not be found (are you
        missing a using directive or an assembly reference?)
bin2xml.cs(26,38): error CS0246: The type or namespace name 'Monitor' could not be found (are you
        missing a using directive or an assembly reference?)

正如this post 所说,VS2008 和 VS2010 之间存在一些变化,我认为 Monitor 类位于一些不同的命名空间中。

可能出了什么问题?如何使用 Visual Studio 2010 以编程方式生成 .coverage 文件?

已解决

  1. 从 Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors\x86 复制 Microsoft.VisualStudio.Coverage.Monitor.dll

  2. 在源码中添加using Microsoft.VisualStudio.CodeCoverage;

  3. 运行csc bin2xml.cs /r:Microsoft.VisualStudio.Coverage.Analysis.dll /r:Microsoft.VisualStudio.Coverage.Monitor.dll

【问题讨论】:

  • 您是否将 ref 添加到 Microsoft.VisualStudio.Coverage.Monitor.dll
  • @K lvanov : 我在 C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies 目录(VS2010 Ultimate 版本)中找不到 dll。

标签: visual-studio-2010 code-coverage profiler


【解决方案1】:

覆盖率监视器 DLL (Microsoft.VisualStudio.Coverage.Monitor.dll) 实际上只是对 vsperfmon.exe 的美化包装。从字面上看,您传入的参数只是成为进程的命令行参数。

最简单的解决方案是只使用Process 类自己运行 vsperfmon.exe(类似于您为 vsinstr.exe 所做的)。

如果您想使用覆盖率监视器 DLL,您需要添加对它的引用。有一个 32 位和 64 位的 vsperfmon.exe(分别用于收集针对 32 位和 64 位进程的代码覆盖率),因此还有一个 32 位和 64 位版本的覆盖率监视器 DLL。

对于 VS2010,32 位覆盖监视器 DLL 位于 Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors\x86。 64 位覆盖监视器 DLL 位于 Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors\x64

如果您想同时支持 32 位和 64 位进程的收集,如果您还想使用覆盖率监视器 DLL(因为覆盖监视器 DLL 不是与系统无关的 MSIL)。如果您只是自己创建 vsperfmon.exe 进程,您只需要一个版本的收集程序即可支持 32 位和 64 位进程。

【讨论】:

  • @Chris :听起来好像是为了获取 .coverage 文件,程序化方法没有那么吸引人,因为可以轻松地使用批处理方法。 - stackoverflow.com/questions/4958776/…
  • @Chris: 添加using Microsoft.VisualStudio.Coverage.Monitor; 给我“bin2xml.cs(7,39): 错误 CS0234: 类型或命名空间名称 'Monitor' 不存在于命名空间 'Microsoft.VisualStudio.Coverage '(您是否缺少程序集引用?)”错误。可能出了什么问题?
  • @prosseek:你不能在一个类型上做using,你只需要使用命名空间:using Microsoft.VisualStudio.Coverage; 然后,Monitor 类型应该是可用的。您需要避免使用 using System.Threading;,因为该命名空间还包含 Monitor 类型。
  • @Chris :我尝试不使用using ..Coverage,但出现错误。我更新了原帖。你能检查一下吗?
  • @prosseek:对不起,我在这里的 cmets 中弄错了,正确的命名空间用法是 using Microsoft.VisualStudio.CodeCoverage;。如果在解决方案资源管理器中右键单击程序集引用,可以选择“在对象浏览器中查看”以查看程序集中定义的命名空间和类型。
【解决方案2】:

它应该是 System.Threading 命名空间的一部分,但不是你的情况

更新:这说明了一切http://blogs.msdn.com/b/phuene/archive/2009/12/01/programmatic-coverage-analysis-in-visual-studio-2010.aspx

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-06-07
  • 2016-01-22
  • 1970-01-01
  • 2011-08-22
  • 2018-01-29
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多