MSBuild - 如何为程序集指定关联的PDB文件?

时间:2016-04-29 03:08:41

标签: c# .net visual-studio msbuild .net-assembly

我使用Reference文件中的.csproj标记引用了另一个.NET程序集。我希望能够在调试我的应用程序时进入此程序集,这需要将与其关联的.pdb文件复制到输出目录。不幸的是,它的.pdb与程序集不在同一目录中,这意味着MSBuild不会接收它。

有没有办法将MSBuild指向.pdb,所以它可以将它复制到输出目录? (我想我可以为此目的使用Copy任务在构建之前将.pdb复制到同一目录,但这感觉有点hackish。)

TL; DR 如果在MSBuild中引用的程序集指定.pdb,它是否不在同一目录中?

谢谢!

1 个答案:

答案 0 :(得分:0)

github上有一个名为msbuild的回购。我不知道它与.net框架附带的msbuild实用程序有多关联,但是有一个关于如何找到相关文件的hint

private void FindRelatedFiles
(
    Reference reference
)
{
    string baseName = reference.FullPathWithoutExtension;
    // Look for companion files like pdbs and xmls that ride along with 
    // assemblies.
    foreach (string companionExtension in _relatedFileExtensions)
    {
        string companionFile = baseName + companionExtension;
        if (_fileExists(companionFile))
        {
            reference.AddRelatedFileExtension(companionExtension);
        }
    }
    ...
}

其中_relatedFileExtensions是填充the extensions的数组:

private string[] _relatedFileExtensions = new string[] { ".pdb", ".xml", ".pri" };

因此,正如我们所看到的,baseName是没有扩展第三方引用的完整路径。因此,相关的* .pdb必须位于同一目录中,如果您希望它由 ResolveAssemblyReferences 目标复制。

如果要从其他来源复制第三方* .pdb文件,则必须处理“hackish”解决方案。其中之一是在AfterBuild目标中复制它:

<Target Name="AfterBuild">
    <Copy SourceFiles="PathToPdb" DestinationFolder="$(OutDir)"/> 
</Target>

或者您可以将文件标记为content

<ItemGroup>
    <Content Include="PathToPdb">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
</ItemGroup>