C# 自定义MsBuild任务:哪个解决方案/其他项目正在参与生成?
是否可以从MsBuild自定义任务中判断项目是从哪个解决方案生成的,或者哪些其他项目也参与了生成 编辑: 试图澄清一下上下文 假设我有以下设置:C# 自定义MsBuild任务:哪个解决方案/其他项目正在参与生成?,c#,.net,msbuild,C#,.net,Msbuild,是否可以从MsBuild自定义任务中判断项目是从哪个解决方案生成的,或者哪些其他项目也参与了生成 编辑: 试图澄清一下上下文 假设我有以下设置: Company +- LibA +- LibA.csproj +- LibB +- LibB.csproj +- App1 +- App1.sln : App1.csproj, LibA.csproj, LibB.csproj +- App1.csproj +- App2 +- App2.sln
Company
+- LibA
+- LibA.csproj
+- LibB
+- LibB.csproj
+- App1
+- App1.sln : App1.csproj, LibA.csproj, LibB.csproj
+- App1.csproj
+- App2
+- App2.sln : App2.csproj, LibA.csproj
+- App2.csproj
如您所见,App1和App2都使用LibA并将其包含在解决方案中。然而,LibB只存在于一种溶液中
现在,让我们假设LibA和LibB之间存在某种关系,并且该关系由LibA/LibA.csproj中的自定义MsBuild任务处理。然而,要做到这一点,定制任务需要知道LibB是否参与了当前构建,或者它是否存在于当前解决方案中。请记住,这两种解决方案中使用的是相同的csproj文件
我不介意自动执行,也不介意将元数据添加到.sln文件中
有没有办法做到这一点?您可以为csprojs解析.sln(因为它不是xml,所以比较难),但是您可以为csproj解析引用和依赖项 下面是一些示例代码(可能会进入自定义任务)
string fileName = @"C:\MyFolder\MyProjectFile.csproj";
XDocument xDoc = XDocument.Load(fileName);
XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
//References "By DLL (file)"
var list1 = from list in xDoc.Descendants(ns + "ItemGroup")
from item in list.Elements(ns + "Reference")
/* where item.Element(ns + "HintPath") != null */
select new
{
CsProjFileName = fileName,
ReferenceInclude = item.Attribute("Include").Value,
RefType = (item.Element(ns + "HintPath") == null) ? "CompiledDLLInGac" : "CompiledDLL",
HintPath = (item.Element(ns + "HintPath") == null) ? string.Empty : item.Element(ns + "HintPath").Value
};
foreach (var v in list1)
{
Console.WriteLine(v.ToString());
}
//References "By Project"
var list2 = from list in xDoc.Descendants(ns + "ItemGroup")
from item in list.Elements(ns + "ProjectReference")
where
item.Element(ns + "Project") != null
select new
{
CsProjFileName = fileName,
ReferenceInclude = item.Attribute("Include").Value,
RefType = "ProjectReference",
ProjectGuid = item.Element(ns + "Project").Value
};
foreach (var v in list2)
{
Console.WriteLine(v.ToString());
}
请详细说明您的问题好吗?可能添加示例或元示例?您可以在LibB中添加自定义属性,并在LibA中使用条件检查该属性是否存在。将环境变量“MSBuildEmitSolution”设置为“1”将导致MSBUILD发出SolutionName.sln.metaproj文件。MSBUILD将该.sln转换为项目格式,这将允许您像解析任何XML文件一样解析它:P