gpt4 book ai didi

visual-studio - 在构建 csproj 文件之前自动修复 ProjectReference Include 路径

转载 作者:行者123 更新时间:2023-12-04 06:29:42 25 4
gpt4 key购买 nike

我有一个 VS 2010 解决方案,其中包含许多项目。
项目引用解决方案中的其他项目。
我注意到,当我在 csproj 文件中有错误的项目引用路径时,如下所示:

<ProjectReference Include="..\..\..\..\WrongFolder\OtherProject.csproj">
<Project>{CD795AA6-9DC4-4451-A8BA-29BACF847AAC}</Project>
<Name>OtherProject</Name>
</ProjectReference>

Visual Studio 将在打开解决方案时解决此问题:
<ProjectReference Include="..\..\..\..\RightFolder\OtherProject.csproj">
<Project>{CD795AA6-9DC4-4451-A8BA-29BACF847AAC}</Project>
<Name>OtherProject</Name>
</ProjectReference>

我想它使用来自 Project 元素的 GUID 来唯一标识解决方案中的项目,从而允许它修复路径。

另一方面,MSBuild 似乎无法修复此路径,并且构建解决方案失败。

有没有办法让 MSBuild 修复路径或使用其他工具或命令将其作为预构建步骤执行,以便正确构建解决方案?

谢谢!

最佳答案

这是 VisualStudio 功能的一部分。但是你可以在构建之前调用一个工具来解决引用。这是您可以详细说明的草稿代码:

using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Xml;

namespace FixProjectReferences
{

class Program
{

// License: This work is licensed under a Creative Commons
// Attribution-ShareAlike 3.0 Unported License.
// Author: Marlos Fabris
// Summary: Updates the project references in csproj.
// Param:
// args[0] = Main project (c:\mainProject.csproj)
// args[1] = Folder to scan other projects (c:\other)
static void Main(string[] args)
{
string mainProject = args[0];
string folder = args[1];
FileInfo mainPrjInfo = new FileInfo(mainProject);
string currentDir = Directory.GetCurrentDirectory();

// Lists all project files in the directory specified
// and scans the GUID's.
DirectoryInfo info = new DirectoryInfo(folder);
FileInfo[] projects = info.GetFiles("*.csproj",
SearchOption.AllDirectories);

Dictionary<Guid, string> prjGuids = new Dictionary<Guid, string>();

foreach (var project in projects)
{
if (project.FullName == mainPrjInfo.FullName)
continue;

Regex regex = new Regex("<ProjectGuid>(\\{.*?\\})</ProjectGuid>");
Match match = regex.Match(File.ReadAllText(project.FullName));
string guid = match.Groups[1].Value;

prjGuids.Add(new Guid(guid), project.FullName);
}

// Loads the main project and verifies if the references are valid.
// If not, updates with the correct ones from the list
// previously generated.
XmlDocument doc = new XmlDocument();
doc.Load(mainPrjInfo.FullName);
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("ns",
"http://schemas.microsoft.com/developer/msbuild/2003");
var nodes = doc.SelectNodes("//ns:ProjectReference", ns);
foreach (XmlNode node in nodes)
{
string referencePath = node.Attributes["Include"].Value;
string path = Path.Combine(mainPrjInfo.Directory.FullName,
referencePath);
if (File.Exists(path))
continue;

string projectGuid = node.SelectSingleNode("./ns:Project",
ns).InnerText;
Guid tempGuid = new Guid(projectGuid);
if (prjGuids.ContainsKey(tempGuid))
{
node.Attributes["Include"].Value = prjGuids[tempGuid];
}
}

doc.Save(mainPrjInfo.FullName);
}

}

}

关于visual-studio - 在构建 csproj 文件之前自动修复 ProjectReference Include 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7650648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com