как найти ссылочный путь через файл * .csproject - PullRequest
5 голосов
/ 15 марта 2011

Я хочу создать автоматический сценарий PowerShell, который сообщает ссылки и пути к ссылкам проекта.Когда подсказка в .csproj не заполнена, я не могу найти способ получить путь к ссылке.

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Вот быстрое решение.Он захватывает каждый .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
0 голосов
/ 15 марта 2011

Одно (хакерское) решение может заключаться в том, чтобы для всех ссылок было установлено значение «Копировать локально» в true.Таким образом, любая ссылаемая dll будет всегда попадать в каталог / bin, и, таким образом, у вас будет путь к ней.

Если предполагается, что все ссылочные сборки находятся в одном месте,однако, может иметь или не иметь смысла копировать даже ссылки, которые существуют в GAC, в локальную копию вместо этого, в зависимости от остальной части вашей среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...