在ExportDll通过ildasm / ilasm运行后,如何获得程序集的代码覆盖率?

时间:2011-10-11 00:11:44

标签: c# mstest code-coverage ilasm ildasm

我在C#程序集上使用了一个构建后的步骤来公开我的dll中的函数签名。此步骤使用http://www.codeproject.com/KB/dotnet/DllExport.aspx中的ExportDll工具。但是,如果我通过mstest运行我的DLL并尝试获取代码覆盖率报告,我会收到以下错误:

Instrumentation error while trying to process the file MyAssembly.dll
Error VSP1011 : Unable to obtain debug information. Link with the /Profile linker switch.

考虑到程序集中没有非托管代码(除少数P / Invoke签名之外),这很奇怪。如果我采取后构建步骤,我的代码将正确检测,我可以获得代码覆盖率报告。因此,我只能得出结论,它必须是这个后构建步骤,而不是代码本身。

我倾向于在构建和分发post-ExportDll版本时,通过非ExportDll版本的代码运行我的单元测试。由于我主要感兴趣的是代码是否经过测试而不是其他组件可以通过DLL导出找到该函数,我不认为这是一个糟糕的解决方案。但是,我觉得它可能只是构建管理中的噩梦,并且必须向团队解释“使用此程序集,而不是程序集”。

有没有人有经验单元测试已通过此工具运行的dll?或者也许是否有人有使用ildasm / ilasm编译,反编译和重新组装的程序集的经验?

1 个答案:

答案 0 :(得分:0)

ExportDll实用程序会重写原始程序集,但在使用ilasm重新编译时,可能不会更新PDB以考虑新的检测。文章似乎没有说这是可能的但是如果你使用/ pdb开关与ilasm,然后这将生成一个与您新装配的程序集兼容的PDB。

查看源代码,您需要将开关添加到program.cs第348行,然后指示ilasm生成新的PDB。