C# 自定义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

是否可以从MsBuild自定义任务中判断项目是从哪个解决方案生成的,或者哪些其他项目也参与了生成

编辑:

试图澄清一下上下文

假设我有以下设置:

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