我正在尝试使用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文件?
答案 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;
}