pdb文件什么时候复制到shadow copy目录?

When will pdb files be copied to shadow copy directory?

我正在对 OpenCover 和 NUnit 进行一些修改以满足我的需要。

简单地说,即使在 Nunit 中启用了卷影复制,我也想获得覆盖率信息。但是,当 pdb 文件不存在时,OpenCover 无法跟踪程序集。当在 NUnit 中启用 shadow-copy 时,被测程序集被复制到一个 shadow 目录,OpenCover 找不到相应的 pdf 文件。

起初,我以为.Net Runtime 只是没有将pdb 文件复制到shadow 目录。但是在我进一步调查这个问题之后,我发现运行时会复制pdb文件,而不是在复制程序集的同时。

我现在的理解是运行时会首先将程序集复制到影子目录。然后将加载这些程序集并通知 Opencover。 OpenCover 发现没有 pdb 文件,所以忽略这些程序集。稍后,pdb 文件被复制,但 OpenCover 未能注意到这一事实,因此无法跟踪这些程序集。

所以我的问题是 .Net Runtime 将 pdb 文件复制到影子目录的确切时间是什么时候?我是否可以修改 OpenCover 以便它能够跟踪这些影子复制程序集?

However, OpenCover is unable to track an assembly when the pdb file is absent.

这是设计使然,因为在没有 PDB 的情况下检测每个加载的程序集意味着检测每个 IL 操作而不是每个序列点,其信息在 PDB 中。

Sometime later, pdb files are copied, but OpenCover failed to notice this fact thus failed to track these assemblies.

如果稍后复制 PDB,那么对于 OpenCover 来说就太晚了,因为运行时已经加载了程序集,因此 OpenCover 做出了检测决定。

现在, OpenCover 使用不同的位置来查找 PDB

  1. 它看起来与从中加载程序集的文件夹相同
  2. 它在 -workingdir
  3. 设置的文件夹中查找
  4. 它在当前目录中查找

但是, 支持 /noshadow 我通常会发现 -mergebyhash 选项可以解决这个问题,如果不是,那么我使用上面列表中最容易使用的#2