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

时间:2011-06-30 14:55:30

标签: visual-studio-2010 code-coverage

我正在尝试将visual studio代码覆盖率文件(data.coverage)导出到xml中,如this blog post from the code analysis team中所述。我已将该帖子中的代码示例移动到自定义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");

路径是完全限定的,它所引用的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>

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

1 个答案:

答案 0 :(得分:7)

5小时后,这是风滚草。我发现了一些additional detail here,这有助于我走得更远。

为了使其正常工作,您需要在pdb和已检测的dll的自定义任务和供应文件夹位置旁边添加一些其他文件。

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

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

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

  4. 关于程序集和符号的路径, 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" });
    

    但是,将路径更改为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" });
    

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

    亲爱的SO人,如果你正在读这篇文章,你会得到一张饼干。