如何通过* .csproject文件查找引用路径

时间:2011-03-15 15:07:39

标签: c# powershell reference

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

2 个答案:

答案 0 :(得分:2)

这是一个快速的解决方案。它抓取当前目录下的每个.csproj文件,并检查每个Reference。对于从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

答案 1 :(得分:0)

一个(hacky)解决方案可能是确保所有引用都将“Copy Local”设置为true。这样,任何引用的dll 总是最终都会出现在/ bin目录中,因此你有一条路径。

如果打算将所有引用的程序集放在一个位置,则根据环境的其余部分,将GAC中存在的引用复制到本地副本可能有意义也可能没有意义。< / p>