【问题标题】:how to find reference path via *.csproject file如何通过 *.csproject 文件查找参考路径
【发布时间】:2011-03-22 03:37:38
【问题描述】:

我想制作一个自动化的 powershell 脚本,用于报告项目的引用和引用路径。 当 .csproj 中的提示路径未填写时,我找不到获取引用路径的方法。

【问题讨论】:

  • 我可能是错的,但我相信提示路径是 csproj 文件中的唯一路径。如果没有填写,我希望编译器在 GAC 和其他常用文件夹(如 bin)中查找参考。我相信如果没有填充提示路径,它根本就找不到。
  • 当然,您可以查看将要搜索的常用文件夹——例如项目中的 bin/ 和系统文件夹。然而,一个更好的问题是为什么你想要这个?你需要这些路径做什么?
  • 有些引用没有在提示路径中列出并且不在 GAC 中,但构建服务仍然可以找到它们。例如Telerik dll 的。这很烦人,因为我自己基于这样一个事实,即自行添加的 dll 与提示路径一起列出,但似乎并非全部都是。
  • @Tomas Lycken 我们的目标是列出我们的解决方案中使用的所有参考资料,以最终解决在通过代码分析和强制门控签入恢复到构建服务器时出现的更大问题。我们希望对自行添加的参考有一个很好的概述。 - 最终,我们希望将所有自添加的引用(dll)复制到源代码管理中每个解决方案的项目特定文件夹

标签: c# powershell reference


【解决方案1】:

这里有一个快速的解决方案。它抓取当前目录下的每个.csproj 文件,并检查每个引用。对于从 GAC 引用的程序集,仅输出名称。对于 GAC 之外的程序集,将输出程序集的完整路径。

$projectFiles = get-childitem . *.csproj -Recurse 

foreach( $projectFile in $projectFiles )
{
    $projectXml = [xml] (get-content $projectFile.FullName)
    $projectDir = $projectFile.DirectoryName

    Write-Host "# $($projectFile.FullName) #"


    foreach( $itemGroup in $projectXml.Project.ItemGroup )
    {
        if( $itemGroup.Reference.Count -eq 0 )
        {
            continue
        }

        foreach( $reference in $itemGroup.Reference )
        {
            if( $reference.Include -eq $null )
            {
                continue
            }

            if( $reference.HintPath -eq $null )
            {
                Write-Host ("{0}" -f $reference.Include)
            }
            else
            {
                $fullpath = $reference.HintPath
                if(-not [System.IO.Path]::IsPathRooted( $fullpath ) )
                {
                    $fullPath = (join-path $projectDir $fullpath)
                    $fullPath = [System.IO.Path]::GetFullPath("$fullPath")
                }
                Write-Host $fullPath
            }
        }
    }

    Write-Host ''
}

请注意,默认情况下,MSBuild 会查看一些注册表项以查找没有提示路径的引用的位置。您可以通过打开详细日志进行编译来查看 MSBuild 的外观和程序集的位置:

msbuild My.csproj /t:build /v:d

【讨论】:

  • 感谢您的脚本,但是我们可以假设当没有填写提示路径时,该文件位于 GAC 中吗?因为 Telerik dll 不在 GAC 中,也没有提示路径
  • Telerik DLL 的 Reference 元素是什么样的?
  • 有趣。你可以做几件事来找出 MSBuild 在哪里找到这个参考。首先,在 Visual Studio 中右键单击它,然后单击属性。检查属性窗格是否有任何线索。其次,使用详细日志从命令行构建项目:msbuild My.csproj /t:build /v:d。在输出中搜索 Telerik 程序集名称,您会发现一个部分说明了 MSBuild 查找的所有位置以及找到它的位置。
  • 非常感谢。使用 MSBuild,我得到了很好的信息。我找到了telerik。它在注册表中查找(基于 Microsoft.Common.Targets)以获取搜索路径:{Registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersSuffix)$(AssemblyFoldersExConditions)};在注册表中有一个包含 Telerik 文件夹路径的键。
【解决方案2】:

一个(hacky)解决方案可能是确保所有引用都将“复制本地”设置为 true。这样,任何引用的 dll 都将总是在 /bin 目录中结束,因此你就有了它的路径。

但是,如果打算将所有引用的程序集放在一个位置,则将 GAC 中存在的引用复制到本地副本可能有意义,也可能没有意义,具体取决于您环境的其余部分。

【讨论】:

    猜你喜欢
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多