问题描述
即使在先前编译的库中定义了该方法,我也试图使用Microsoft.CodeAnalysis
获取被调用方法的XML文档。
如果我有SymbolAnalysisContext
或ISymbol
,我知道如何获取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 (将#修改为@)