C# 获取作为项目的项目引用
C# get project references that are projects
是否可以获取我的项目拥有的所有项目引用?因此,例如,我的项目 A 有对项目 B 和项目 C 的引用。我不想获得对库等所有内容的引用,只是我解决方案中的其他项目。我在代码中需要它,这样我就可以将它保存在数据库中。
您只需右键单击每个项目并导航至 BuildDependencies > ProjectDependencies。
假设您没有尝试编写外部项目analyzer/dependency graph creator。
根据评论更新:
如果您正在执行静态代码分析器(通过解决方案中的文件),您可以迭代 .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);
}
遗憾的是,没有"IsPartOfSolution"-您可以查看的标志。
但压缩完整列表相对容易:
IEnumerable<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.Contains("SolutionName"));
对我来说听起来像是代码分析器,
如果您开始一个新的 'Stand-Alone Code Analysis tool' 项目,将为您生成一个非常完整的示例项目。
我不太确定它能走多远,但你最终会得到一个 SolutionLoader
对象。
遍历 loader.Solution.Projects
以获取解决方案中的所有项目。
每个 Project
都有一个 ProjectId
和一个 属性 AllProjectReferences
(包括项目外的引用)。
通过包含在您的解决方案中的 projectId 过滤这些应该让您顺利进行。
我在 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)它可能会有一些用处
您可以使用 Microsoft.Build.Evaluation
中的 classes 来帮助解决这个问题。
具体来说,ProjectCollection
class。要使用它,您需要将以下引用添加到您的项目中:
Microsoft.Build
Microsoft.Build.Utilities.Core
(通过 引用管理器 添加这些内容时,请查看程序集 -> 扩展,否则您可能会引用旧版本,而该版本不适用于较新的项目文件。)
然后你可以编写如下代码来遍历所有项目引用:
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);
}
}
}
}
是否可以获取我的项目拥有的所有项目引用?因此,例如,我的项目 A 有对项目 B 和项目 C 的引用。我不想获得对库等所有内容的引用,只是我解决方案中的其他项目。我在代码中需要它,这样我就可以将它保存在数据库中。
您只需右键单击每个项目并导航至 BuildDependencies > ProjectDependencies。
假设您没有尝试编写外部项目analyzer/dependency graph creator。
根据评论更新: 如果您正在执行静态代码分析器(通过解决方案中的文件),您可以迭代 .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);
}
遗憾的是,没有"IsPartOfSolution"-您可以查看的标志。
但压缩完整列表相对容易:
IEnumerable<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.Contains("SolutionName"));
对我来说听起来像是代码分析器,
如果您开始一个新的 'Stand-Alone Code Analysis tool' 项目,将为您生成一个非常完整的示例项目。
我不太确定它能走多远,但你最终会得到一个 SolutionLoader
对象。
遍历 loader.Solution.Projects
以获取解决方案中的所有项目。
每个 Project
都有一个 ProjectId
和一个 属性 AllProjectReferences
(包括项目外的引用)。
通过包含在您的解决方案中的 projectId 过滤这些应该让您顺利进行。
我在 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)它可能会有一些用处
您可以使用 Microsoft.Build.Evaluation
中的 classes 来帮助解决这个问题。
具体来说,ProjectCollection
class。要使用它,您需要将以下引用添加到您的项目中:
Microsoft.Build
Microsoft.Build.Utilities.Core
(通过 引用管理器 添加这些内容时,请查看程序集 -> 扩展,否则您可能会引用旧版本,而该版本不适用于较新的项目文件。)
然后你可以编写如下代码来遍历所有项目引用:
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);
}
}
}
}