使用Microsoft.CodeAnalysis / Roslyn获取XML文档

问题描述

即使在先前编译的库中定义了该方法,我也试图使用Microsoft.CodeAnalysis获取被调用方法的XML文档。

如果我有SymbolAnalysisContextISymbol,我知道如何获取XML文档。 ISymbol具有方法GetDocumentationCommentXml(),该方法返回xml字符串。

我的问题是,我找不到获取被调用方法的ISymbol的方法。
我正在使用操作操作来查找所有表达式语句,这就是如何为每个匹配的表达式获得一个OperationAnalysisContext
这时我被困住了。

我正在尝试获取包含类/名称空间的SyntaxTree或直接获取符号。 但是我不确定这是否是正确的方法。 XML文档存储在XML文档文件中,而不存储在(反编译)程序集中。 你有什么建议吗?我不需要完整的解决方案,但是一些提示如何到达那里的提示非常好。

更新
经过几天的研究,似乎roslyn编译器不在乎文档,您必须手动加载它。
这就是为什么我开始搜索包含的程序集,将其加载并使用Assembly.CodeBase属性来获取xmldocumentation路径的原因。
令人遗憾的是,在系统程序集旁边既没有包含文档的xml文件,也没有嵌入式文件(例如system.private.corelib)。系统程序集包含一个嵌入式xml文件,但是该文件不包含文档(根元素不是doc,而是linker)。

要使用Assembly.CodeBase属性,我必须将目标框架从.netstandard1.3升级到.netstandard1.5

我更新了代码示例以表示我的当前状态...

以下是一个说明性示例:

那是我的分析仪:

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class Analyzer: DiagnosticAAnalyzer
{
    private static readonly DiagnnosticDescriptor Rule; // is initialized
    
    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
    {
        get => ImmutableArray.Create(Rule);
    }

    public override void Initialize(AnalysisContext context)
    {
        context.RegisterOperationAction(AnalyzeOperation,OperationKind.ExpressionStatement);
    }
    
    private void AnalyzeOperation(OperationAnalysisContext context)
    {
        if(!(context.Operation is IExpressionStatementOperation expressionStatementOperation))
        {
            throw new InvalidOperationException();
        }

        if(!(expressionStatementOperation.Operation is IInvocationOperation invocationOperation))
        {
            throw new InvalidOperationException();
        }

        IMethodSymbol methodSymbol  = invocationOperation.TargetMethod;

        AssemblyIdentity          identity     = methodSymbol.ContainingAssembly.Identity;
        AssemblyName assemblyName = new AssemblyName
                                    {
                                        Name        = identity.Name,Version     = identity.Version,Flags       = identity.Flags,ContentType = identity.ContentType
                                    };

        Assembly assembly = Assembly.Load(assemblyName);
    }
}

那是一份分析过的文件:

using System.IO;

namespace myProject
{
    public class MyClass
    {
        public void MyMethod(StreamReader reader)
        {
            reader.ReadToEnd();
        }
    }
}

我正在尝试获取`StreamReader.ReadToEnd()的整个XML文档

编辑:
刚才我发现类XmlDocumentationProvider具有两个静态方法,可以通过传递文件或字节来获取实例,但是我不知道如何使用它来实现我的目标...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...