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

本文关键字:程序集 代码覆盖率 运行 ExportDll 通过 ildasm ilasm | 更新日期: 2023-09-27 18:10:58

我正在使用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签名)。如果我去掉构建后的步骤,我的代码就会被正确地检测,我就可以得到代码覆盖率报告。因此,我只能得出结论,这一定是构建后的步骤,而不是代码本身。

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

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

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

ExportDll实用程序重写了原始程序集,但在使用ilasm重新编译时,它可能不会更新PDB以考虑新的工具。这篇文章似乎并没有说这是可能的,但是如果您将/pdb开关与ilasm一起使用,那么这应该会产生一个与您新检测的程序集兼容的pdb。

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