2011-06-30 75 views
1

我想作爲this blog post from the code analysis team描述到Visual Studio代碼覆蓋率文件(data.coverage)導出到XML。我已經將該帖子中的代碼示例移到了一個自定義的MSBuild任務中。我的自定義任務引用位於Visual Studio的PrivateAssemblies文件夾中的Microsoft.VisualStudio.Coverage.Analysis.dll合併Visual Studio代碼覆蓋率失敗ImageNotFoundException

立即嘗試加載代碼覆蓋率文件會拋出代碼分析類型異常ImageNotFoundException,指出「圖像文件完全限定文件路徑到dll無法找到」。

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

該路徑是完全限定的並且它引用的DLL確實存在。我的測試設置將此文件列爲儀器組件,並設置了「儀器就位」複選框。我可以在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> 

任何人都可以建議我需要做什麼才能正確工作?

回答

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)

關於路徑組件和符號中,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民俗,如果你正在看這個,你會得到一個餅乾。

+0

+1和謝謝......救了我幾個小時,即使沒有其他人先得到答案! –

+0

+1還有一點,您必須添加引用(或複製dll,如Microsoft.VisualStudio.Coverage.Analysis.dll,Microsoft.VisualStudio.Coverage.Symbols.dll,dbghelp.dll)的地方不在您的主項目文件,但使用CoverageInfo類的文件。我花了一些時間來找出在哪裏添加引用。 Out文件夾中也不應該有任何尾隨的'\'。例如c:\ project \ testresults \ x \ Out \將導致錯誤。 –

+0

我有MS2013Pro版,並且沒有PrivateAssemblies文件夾中的Symbols.dll文件。請幫助!! – adeel41

相關問題