Msbuild 如何从本地放置的DLL添加自定义roslyn分析器?

Msbuild 如何从本地放置的DLL添加自定义roslyn分析器?,msbuild,roslyn,code-analysis,roslyn-code-analysis,microsoft.codeanalysis,Msbuild,Roslyn,Code Analysis,Roslyn Code Analysis,Microsoft.codeanalysis,我创建了一个Roslyn Analyzer项目,它生成一个nuget包和它的DLL。我想在独立的代码分析项目中使用该DLL。我该怎么做?例如,我有以下代码: MSBuildLocator.RegisterDefaults(); var filePath = @"C:\Users\user\repos\ConsoleApp\ConsoleApp.sln"; var msbws = MSBuildWorkspace.Create(); var soln = await msbws.OpenSolut

我创建了一个Roslyn Analyzer项目,它生成一个nuget包和它的DLL。我想在独立的代码分析项目中使用该DLL。我该怎么做?例如,我有以下代码:

MSBuildLocator.RegisterDefaults();
var filePath = @"C:\Users\user\repos\ConsoleApp\ConsoleApp.sln";
var msbws = MSBuildWorkspace.Create();
var soln = await msbws.OpenSolutionAsync(filePath);
var errors = new List<Diagnostic>();
foreach (var proj in soln.Projects)
{
    var analyzer = //Here i want to load analyzer from DLL present locally.
    var compilation = await proj.GetCompilationAsync();
    var compWithAnalyzer = compilation.WithAnalyzers(analyzer.GetAnalyzersForAllLanguages());
    var res = compWithAnalyzer.GetAllDiagnosticsAsync().Result;
    errors.AddRange(res.Where(r => r.Severity == DiagnosticSeverity.Error).ToList());
}
但是这里AnalyzerAssemblyLoader显示错误,因为它无法访问到其保护级别(类是内部的)

请建议我是否可以这样做。

使用
.WithAnalyzers()
选项将允许您传递analyzer的实例。如果在本地引用DLL,可以像创建任何其他对象一样创建分析器并将其传递给编译

var analyzer=new MyAnalyzer();
var compilation=await proj.GetCompilationAsync();
var compWithAnalyzer=compilation.WithAnalyzer(ImmutableArray.Create(analyzer));
如果您没有引用程序集,但希望在运行时加载它,则可以使用通常基于
System.Reflection
的方法来获取分析器的实例:

var assembly=assembly.LoadFrom(@.dll”);
变量分析器=assembly.GetTypes()
.Where(t=>t.GetCustomAttribute()是对象)
.Select(t=>(DiagnosticanAnalyzer)Activator.CreateInstance(t))
.ToArray();
compWithAnalyzers=编译.WithAnalyzers(ImmutableArray.Create(analyzers));
使用
.WithAnalyzers()
选项可以传递analyzer的实例。如果在本地引用DLL,可以像创建任何其他对象一样创建分析器并将其传递给编译

var analyzer=new MyAnalyzer();
var compilation=await proj.GetCompilationAsync();
var compWithAnalyzer=compilation.WithAnalyzer(ImmutableArray.Create(analyzer));
如果您没有引用程序集,但希望在运行时加载它,则可以使用通常基于
System.Reflection
的方法来获取分析器的实例:

var assembly=assembly.LoadFrom(@.dll”);
变量分析器=assembly.GetTypes()
.Where(t=>t.GetCustomAttribute()是对象)
.Select(t=>(DiagnosticanAnalyzer)Activator.CreateInstance(t))
.ToArray();
compWithAnalyzers=编译.WithAnalyzers(ImmutableArray.Create(analyzers));

如果将该类公开,会发生什么情况?该类在Microsoft.CodeAnalysis中定义,因此我无法更改。如果将该类公开,会发生什么情况?该类在Microsoft.CodeAnalysis中定义,因此我无法更改。
var analyzer = new AnalyzerFileReference("Path to DLL", new AnalyzerAssemblyLoader());