合并Visual Studio代码覆盖率与ImageNotFoundException失败

bry*_*ook 2 code-coverage visual-studio-2010

我正在尝试将Visual Studio代码覆盖文件(data.coverage)导出到xml中,如代码分析团队此博客文章中所述.我已将该帖子中的代码示例移动到自定义MSBuild任务中.我的自定义任务引用位于Visual Studio的PrivateAssemblies文件夹中的Microsoft.VisualStudio.Coverage.Analysis.dll.

刚刚开始,尝试加载代码覆盖文件会引发代码分析类型异常ImageNotFoundException,指出" 无法找到图像文件完全限定文件路径到dll ".

 // the following line throws an exception
 CoverageInfo current = 
     CoverageInfo.CreateFromFile( "c:\path\testresults\x\y\z\data.coverage");
Run Code Online (Sandbox Code Playgroud)

路径是完全限定的,它所引用的DLL确实存在.我的testsettings将此文件列为仪器组件,并设置了"Instrument in place"复选框.我可以在Visual Studio中查看代码覆盖率,因此我知道覆盖范围正在发挥作用.

我正在从Visual Studio命令行运行我的MSBuild脚本.它看起来像这样:

<Project ToolsVersion="4.0" DefaultTargets="Default;"
      xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

   <UsingTask TaskName="CustomTasks.MergeCoverageTask" 
      AssemblyFile="CustomTasks.dll" 
      />

   <Target Name="Default">

      <ItemGroup>
         <CoverageFiles Include="**\data.coverage" />
      </ItemGroup>

      <MergeCoverageTask
           CoverageFiles="@(CoverageFiles)"
           OutputFile="output.xml"
           />
   </Target>
 </Project>
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我需要做些什么才能使其正常工作?

bry*_*ook 7

5个小时后,这是一个风滚草.我在这里找到了一些额外的细节,这有助于我走得更远.

为了实现这一点,您需要在自定义任务和pdb和已检测dll的供应文件夹位置旁边添加一些其他文件.

关于其他文件,您需要以下内容:

  1. 自定义生成任务必须引用Microsoft.VisualStudio.Coverage.Analysis.dll
  2. 您的bin文件夹必须包含以下附加文件:

    • Microsoft.VisualStudio.Coverage.Symbols.dll
    • dbghelp.dll
  3. (如果您没有安装Visual Studio,则必须在msdia100.dll上执行regsvr32.exe)

关于程序集和符号的路径,CreateFromFile方法采用要搜索的文件夹集合.看起来很奇怪的是错误抱怨无法找到丢失的仪表化程序集,它指定了完整路径.

找不到图像文件c:\ project\output\Assembly.dll.

...但是如果您指定该路径,则它不起作用.

 CoverageInfo current = 
 CoverageInfo.CreateFromFile( "c:\project\testresults\x\In\data.coverage", 
              new string[] { "c:\project\output" },
              new string[] { "c:\project\output" });
Run Code Online (Sandbox Code Playgroud)

但是,将路径更改为TestResults输出的文件夹工作正常:

 CoverageInfo current = 
 CoverageInfo.CreateFromFile( "c:\project\testresults\x\In\data.coverage", 
              new string[] { "c:\project\testresults\x\Out" },
              new string[] { "c:\project\testresults\x\Out" });
Run Code Online (Sandbox Code Playgroud)

我怀疑"仪器就位"是否真的意味着在该文件夹中,或仪器并复制到MS Test运行文件夹.

亲爱的SO人,如果你正在读这个,你会得到一个饼干.