Roslyn:如何确定特定的程序集是否在编译中被引用?

3
我正在编写一个Roslyn诊断分析器,我想在注册任何其他操作之前通过 RegisterCompilationStartAction 检测是否引用了System.Collections.Immutable。目前我的方法如下:
context.RegisterCompilationStartAction(compilationStartContext =>
{
    var compilation = compilationStartContext.Compilation;
    if (compilation.GetTypeByMetadataName("System.Collections.Immutable.ImmutableArray`1") == null)
    {
        return;
    }

    ...
});

这个方法是可行的,但我觉得并不是最干净的方式。我是否可以以程序集名称为参数获取对应的MetadataReference对象,并检查它是否为空,就像GetMetadataReference("System.Collections.Immutable") == null一样?(因为GetMetadataReference方法不接受字符串参数,所以实际上这并不起作用。)如果不行,是否还有其他更干净的方法可以完成而不涉及特定类型的选择?谢谢。

1个回答

1

不必搜索类型,您可以通过引用来搜索并解析MetadataReference,以检查特定程序集是否包含在项目中:

if(!compilation.References.Any(reference => 
        compilation.GetAssemblyOrModuleSymbol(reference)
        .Name == "System.Collections.Immutable"))
{
    return;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接