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

C# 如何通过*.csproject文件查找引用路径,c#,powershell,reference,C#,Powershell,Reference,我想制作一个自动化的powershell脚本,用于报告项目的引用和引用路径。 当.csproj中的hintpath没有填写时,我找不到一种方法来获取引用的路径 一个(hacky)解决方案是确保所有引用都将“Copy Local”设置为true。这样,引用的任何dll都将始终位于/bin目录中,因此您有一个指向它的路径 但是,如果目的是将所有引用的程序集放在一个位置,那么将GAC中存在的引用复制到本地副本可能有意义,也可能没有意义,这取决于环境的其他部分。这里有一个快速解决方案。它获取当前目录下的

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

一个(hacky)解决方案是确保所有引用都将“Copy Local”设置为true。这样,引用的任何dll都将始终位于/bin目录中,因此您有一个指向它的路径


但是,如果目的是将所有引用的程序集放在一个位置,那么将GAC中存在的引用复制到本地副本可能有意义,也可能没有意义,这取决于环境的其他部分。

这里有一个快速解决方案。它获取当前目录下的每个
.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

我可能错了,但我相信提示路径是csproj文件中唯一的路径。如果没有填写,我希望编译器在GAC和其他常用文件夹(如bin)中查找引用。我相信如果hintpath没有被填充,它就根本找不到。当然,你可以查看将被搜索的常用文件夹,比如项目中的bin/和系统文件夹。然而,一个更好的问题是你为什么想要这个?您需要这些路径做什么?有些引用没有与hintpath一起列出,也不在GAC中,但构建服务仍然可以找到它们。e、 g.telerik动态链接库。这很烦人,因为我是基于这样一个事实,即自添加的dll是用hintpath列出的,但似乎不是所有的都是。@Tomas Lycken我们的目标是列出解决方案中使用的所有引用,以最终解决在使用代码分析和强制门控签入恢复到buildserver时出现的更大问题。我们想对自我添加的引用有一个很好的概述最终,我们希望将所有自添加引用(DLL)复制到源代码管理上每个解决方案的特定于项目的文件夹中感谢您的脚本,但是我们是否可以假设,当没有填充hintpath时,该文件位于GAC中?因为Telerik DLL不在GAC中,也没有hintpathWhat,Telerik DLL的参考元素看起来像什么?很有趣。您可以做一些事情来找出MSBuild在哪里找到此引用。首先,在VisualStudio中右键单击它,然后单击属性。检查“属性”窗格以获取任何线索。其次,使用详细日志从命令行构建项目:
msbuild My.csproj/t:build/v:d
。在输出中搜索Telerik程序集名称,您将找到一个部分,其中说明MSBuild查找的所有位置以及找到它的位置。Thx很多。使用MSBuild,我可以获得良好的信息。我找到电话了。它在注册表中查找(基于Microsoft.Common.Targets)以获取搜索路径:{registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersAffix)$(AssemblyFoldersExConditions)};在注册表中有一个带有Telerik文件夹路径的键。