2

I need to generate .coverage file programmatic way. This post explains a C# code to do it as follows.

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);

Unfortunately, when I compile this code, I get the following error.

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?)

As this post says, there are some changes between VS2008 and VS2010, I think the Monitor class is in some different namespace.

What might be wrong? How can I generate the .coverage file programmatically with Visual Studio 2010?

SOLVED

  1. Copy the Microsoft.VisualStudio.Coverage.Monitor.dll from Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors\x86

  2. Add using Microsoft.VisualStudio.CodeCoverage; in the source code

  3. Run csc bin2xml.cs /r:Microsoft.VisualStudio.Coverage.Analysis.dll /r:Microsoft.VisualStudio.Coverage.Monitor.dll.
prosseek
  • 182,215
  • 215
  • 566
  • 871

2 Answers2

2

The coverage monitor DLL (Microsoft.VisualStudio.Coverage.Monitor.dll) is really just a glorified wrapper around vsperfmon.exe. Literally, the arguments you pass in just become command-line arguments to the process.

The easiest solution is to just use the Process class to run vsperfmon.exe yourself (similar to what you're doing for vsinstr.exe).

If you want to use the coverage monitor DLL, you need to add a reference to it. There is a 32- and 64-bit vsperfmon.exe (for collecting code coverage against 32- and 64-bit processes, respectively), so there is also a 32- and 64-bit version of the coverage monitor DLL.

For VS2010, the 32-bit coverage monitor DLL lives in Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors\x86. The 64-bit coverage monitor DLL lives in Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors\x64.

If you want to support collection on both 32- and 64-bit processes, you'll need to have a 32- and 64-bit version of your collection program if you also want to use the coverage monitor DLL (since the coverage monitor DLL is not system-agnostic MSIL). If you just create the vsperfmon.exe process yourself, you'd only need to have one version of your collection program to support both 32- and 64-bit processes.

Chris Schmich
  • 29,128
  • 5
  • 77
  • 94
  • @Chris : It sounds like that for getting the .coverage file, programmatic approach isn't so attractive, as one can use the batch method easily. - http://stackoverflow.com/questions/4958776/batch-running-of-vs-code-coverage-tools – prosseek Feb 11 '11 at 03:18
  • @Chris: adding `using Microsoft.VisualStudio.Coverage.Monitor;` gives me "bin2xml.cs(7,39): error CS0234: The type or namespace name 'Monitor' does not exist in the namespace 'Microsoft.VisualStudio.Coverage' (are you missing an assembly reference?)" error. What might be wrong? – prosseek Feb 11 '11 at 03:26
  • @prosseek: you can't do `using` on a type, you just need to use the namespace: `using Microsoft.VisualStudio.Coverage;` Then, the `Monitor` type should be available. You'll want to avoid `using System.Threading;` since that namespace also contains a `Monitor` type. – Chris Schmich Feb 11 '11 at 06:23
  • @Chris : I tried without the `using ..Coverage`, but I got the errors. I updated the original post. Could you check that? – prosseek Feb 11 '11 at 07:24
  • @prosseek: sorry, I was mistaken in my comments here, the correct namespace usage is `using Microsoft.VisualStudio.CodeCoverage;`. If you right-click on the assembly reference in Solution Explorer, you can select "View in Object Browser" to see the namespaces and types defined in the assembly. – Chris Schmich Feb 11 '11 at 08:14
0

it should be part of System.Threading namespace, but not in your case

Update: this explains it all http://blogs.msdn.com/b/phuene/archive/2009/12/01/programmatic-coverage-analysis-in-visual-studio-2010.aspx

Kris Ivanov
  • 10,476
  • 1
  • 24
  • 35