MSBuildWorkspace获取嵌入式资源文件

时间:2017-05-19 19:39:04

标签: c# msbuild roslyn

我正在尝试使用Roslyn和MSBuild Api从解决方案中获取所有嵌入式资源文件。

private async Task<Document> CheckConstForLocalization(Document document, LocalDeclarationStatementSyntax localDeclaration,
    CancellationToken cancellationToken)
{
    foreach (var project in document.Project.Solution.Projects)
    {
        foreach (var sourceDoc in project.AdditionalDocuments)
        {
            if (false == sourceDoc.Name.EndsWith(".cs"))
            {
                Debug.WriteLine(sourceDoc.Name);
            }
        }

        foreach (var sourceDoc in project.Documents)
        {
            if (false == sourceDoc.Name.EndsWith(".cs"))
            {
                Debug.WriteLine(sourceDoc.Name);
            }
        }
    }

    var newRoot = await document.GetSyntaxRootAsync(cancellationToken);
    // Return document with transformed tree.
    return document.WithSyntaxRoot(newRoot);
}

当我将资源文件修改为AdditionFiles时,我可以通过项目AdditionalDocuments获取它们。但是我希望能够抓住这些而不这样做。该文件未出现在“文档”或“其他文档”

如何在不修改属性的情况下找到Resx文件?

2 个答案:

答案 0 :(得分:1)

目前你无法做到。它不受API的支持。 (我昨天正在研究这个问题。)

feature request支持它,您可能愿意支持和订阅,但我不相信目前有任何方法可以做到这一点。

我的理解是Visual Studio比Roslyn的支持更紧密地挂钩到MSBuild。 (有关其他示例,请参阅issue I raised about <Deterministic>。)

答案 1 :(得分:1)

我找到了找到设计器文件的方法,通过迭代csproj文件并获取嵌入资源,我获得了相关的C#文档名称。

public const string LAST_GENERATED_TAG = "LastGenOutput";
public const string RESX_FILE_EXTENSION = ".resx";
public List<string> GetResourceDesignerInfo(Project project)
{
    XDocument xmldoc = XDocument.Load(project.FilePath);
    XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";

    var resxFiles = new List<string>();
    foreach (var resource in xmldoc.Descendants(msbuild + "EmbeddedResource"))
    {
        string includePath = resource.Attribute("Include").Value;

        var includeExtension = Path.GetExtension(includePath);
        if (0 == string.Compare(includeExtension, RESX_FILE_EXTENSION, StringComparison.OrdinalIgnoreCase))
        {
            var outputTag = resource.Elements(msbuild +  LAST_GENERATED_TAG).FirstOrDefault();

            if (null != outputTag)
            {
                resxFiles.Add(outputTag.Value);
            }
        }
    }

    return resxFiles;
}