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