msbuild引用解析

msbuild引用解析,msbuild,dependencies,csproj,targets,build-dependencies,Msbuild,Dependencies,Csproj,Targets,Build Dependencies,我最近一直在做一些工作,分析源代码管理中各种项目之间的关系。到目前为止,我一直在通过Select Xml cmdlet使用PowerShell和XPath来处理我们的csproj文件,但这依赖于我对MSBuild如何使用项目文件中的ProjectReference和Reference元素所知甚少。我突然意识到,如果我可以使用MSBuild本身来解析引用,然后以某种方式检查引用解析过程的结果,那就更好了 MSBuild专家:这看起来可能吗?这是否需要编写一个自定义目标文件或其他东西?既然cspro

我最近一直在做一些工作,分析源代码管理中各种项目之间的关系。到目前为止,我一直在通过Select Xml cmdlet使用PowerShell和XPath来处理我们的csproj文件,但这依赖于我对MSBuild如何使用项目文件中的ProjectReference和Reference元素所知甚少。我突然意识到,如果我可以使用MSBuild本身来解析引用,然后以某种方式检查引用解析过程的结果,那就更好了

MSBuild专家:这看起来可能吗?这是否需要编写一个自定义目标文件或其他东西?既然csproj文件也导入了Microsoft.CSharp.targets,我还会被迫构建项目吗


任何洞察都很好。谢谢

这真的很容易。首先参考这些组件:

Microsoft.Build
Microsoft.Build.Engine
Microsoft.Build.Framework
Microsoft.Build.Utilities.v4.0
…您可以围绕MSBuild对象模型创建一些工具。我有一个自定义MSBuild任务,它在构建中执行此分析,代码段如下:

private bool CheckReferences(string projectFullPath)
{
    var project = new Project(projectFullPath);

    var items = project.GetItems("Reference");
    if (items == null)
        return true;

    foreach (var item in items)
    {
        if (item == null)
            continue;

        if (string.IsNullOrWhiteSpace(item.UnevaluatedInclude))
            continue;
        if (!item.HasMetadata("HintPath"))
            continue;

        string include = item.UnevaluatedInclude;
        string hintPath = item.GetMetadata("HintPath").UnevaluatedValue;

        if (!string.IsNullOrWhiteSpace(hintPath))
            if (hintPath.Contains(@"C:\") || hintPath.Contains("C:/"))
                LogWarning("Absolute path Reference in project {0}", projectFullPath);
    }

    return true;
}

您应该研究Ms Build社区任务。我发现它们真的很有用。实际上,我只是通过使用XPath选择HintPath元素并进行类似的检查(以及System.IO.Path.IsPathRooted!;)来做同样的事情,但我希望找到一个解决方案,利用MSBuild在查找引用程序集时使用的相同复杂构建逻辑。从外观上看,这只是分析HintPath元素中包含的字符串,对吗?在这个特定示例中,是的,它只是检查字符串。但是,您可以在XPath无法轻松完成的任务中执行其他类型的验证。在代码中,您不仅可以访问未计算的“Include”字符串,还可以访问已计算的值,以及包括任何导入在内的整个项目对象模型。这取决于验证分析的深度。