C # получить ссылки на проекты, которые являются проектами - PullRequest
0 голосов
/ 09 мая 2019

Можно ли получить все ссылки на проекты, которые есть у моего проекта? Так, например, мой Проект A имеет ссылку на Проект B и Проект C. Я не хочу получать ссылки на все, как библиотеки и тому подобное, только на другие проекты в моем решении. Мне нужно это в коде, чтобы я мог сохранить его в базе данных.

Ответы [ 5 ]

1 голос
/ 09 мая 2019

Вы можете использовать классы от Microsoft.Build.Evaluation, чтобы помочь с этим.

В частности, класс ProjectCollection. Для этого вам необходимо добавить следующие ссылки на ваш проект:

  • Microsoft.Build
  • Microsoft.Build.Utilities.Core

(При добавлении их через Reference Manager посмотрите в Сборки -> Расширения, в противном случае вы можете ссылаться на старую версию, которая не работает с более новыми файлами проекта.)

Затем вы можете написать код, подобный следующему, для перебора всех ссылок проекта:

using System;
using Microsoft.Build.Evaluation;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            var projectCollection = new ProjectCollection();
            var projFile          = @"E:\Test\CS7\ConsoleApp1\ConsoleApp1.csproj";
            var project           = projectCollection.LoadProject(projFile);
            var projectReferences = project.GetItems("ProjectReference");

            foreach (var projectReference in projectReferences)
            {
                Console.WriteLine(projectReference.EvaluatedInclude);
            }
        }
    }
}
0 голосов
/ 09 мая 2019

У меня есть этот код на vb.net, который может соответствовать вашим требованиям:

Private Sub GetProjectReferences()
    Dim lines = New List(Of String)
    Dim path = "..\..\TestApp.vbproj"
    For Each line In File.ReadAllLines(path)
        If line.Contains("<ProjectReference") Then
            Dim projNameWithExtension = line.Substring(line.LastIndexOf("\") + 1)
            Dim projName = projNameWithExtension.Substring(0, projNameWithExtension.IndexOf(".vbproj"))
            lines.Add(projName)
        End If
    Next
End Sub

Если вы переведете его в c # (определения функций и переменных и .vbproj в .csproj), он может бытьиспользовать

0 голосов
/ 09 мая 2019

К сожалению, нет флага IsPartOfSolution, который вы можете проверить.

Но полный список сравнительно легко сжать:

IEnumerable<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.Contains("SolutionName"));  
0 голосов
/ 09 мая 2019

Для меня звучит как анализатор кода,

Если вы запустите новый проект «Инструмент анализа автономного кода», для вас будет создан довольно полный пример проекта. Я не совсем уверен, как далеко это зайдет, но в итоге вы получите SolutionLoader объект.

Переберите loader.Solution.Projects, чтобы получить все проекты в вашем решении. Каждый Project имеет ProjectId и свойство AllProjectReferences (которое включает ссылки вне вашего проекта).

Фильтрация их по идентификаторам проектов, включенных в ваше решение, поможет вам в этом.

0 голосов
/ 09 мая 2019

Вы можете просто щелкнуть правой кнопкой мыши по каждому проекту и перейти к BuildDependencies> ProjectDependencies.

Предполагается, что вы не пытаетесь написать внешний анализатор проекта / создатель графика зависимостей.

Обновление согласно комментарию: Если вы выполняете статический анализатор кода (просмотрите файлы в решении) вы можете перебирать файлы .csproj и извлекать части, как показано ниже:

  <ItemGroup>
    <ProjectReference Include="..\xyz.Service.Client\xyz.Service.Client.csproj" />
    <ProjectReference Include="..\xyz.Service.Interface\xyz.Service.Interface.csproj" />
    <ProjectReference Include="..\xyz.Web.Interface\xyz.Web.Interface.csproj" />
  </ItemGroup>

Вы можете сопоставить его с желаемой структурой dto и сохранить по своему желанию.Вот некоторый код, который может облегчить решение:

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument projDefinition = XDocument.Load(fullProjectPath);
IEnumerable<string> references = projDefinition
    .Element(msbuild + "Project")
    .Elements(msbuild + "ItemGroup")
    .Elements(msbuild + "Reference")
    .Select(refElem => refElem.Value);
foreach (string reference in references)
{
    Console.WriteLine(reference);
}
...