使用Visual Studio 2010生成.coverage文件编程方式

时间:2011-02-11 02:51:09

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

我需要以编程方式生成.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

  2. 复制Microsoft.VisualStudio.Coverage.Monitor.dll
  3. 在源代码中添加using Microsoft.VisualStudio.CodeCoverage;

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

2 个答案:

答案 0 :(得分:2)

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

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

如果要使用coverage监视器DLL,则需要添加对它的引用。有一个32位和64位vsperfmon.exe(分别用于收集32位和64位进程的代码覆盖率),因此还有32位和64位版本的coverage监视器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位进程的集合,如果您还想使用coverage监视器DLL,则需要拥有32位和64位版本的集合程序(因为coverage监视器DLL 系统无关MSIL)。如果您只是自己创建vsperfmon.exe进程,则只需要一个版本的集合程序来支持32位和64位进程。

答案 1 :(得分:0)

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

更新:这解释了所有http://blogs.msdn.com/b/phuene/archive/2009/12/01/programmatic-coverage-analysis-in-visual-studio-2010.aspx