问题
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
Copy the Microsoft.VisualStudio.Coverage.Monitor.dll from Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors\x86
Add
using Microsoft.VisualStudio.CodeCoverage;
in the source code- Run
csc bin2xml.cs /r:Microsoft.VisualStudio.Coverage.Analysis.dll /r:Microsoft.VisualStudio.Coverage.Monitor.dll
.
回答1:
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.
回答2:
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
来源:https://stackoverflow.com/questions/4965173/generating-coverage-file-programmatic-way-with-visual-studio-2010