如何在Roslyn分析器测试中引用本地程序集并解决版本冲突
Roslyn分析器测试中引用Framework.dll的版本冲突问题
问题背景
我正在开发Roslyn分析器,用于检查框架代码中特性的使用情况,相关项目结构及代码示例如下:
Framework.csproj(定义特性)
public class ModuleAttribute : Attribute { }
Framework.Analyzer.csproj(分析器实现)
[DiagnosticAnalyzer(LanguageNames.CSharp)] public class IsModuleAPublicClassAnalyzer : DiagnosticAnalyzer { ... }
Framework.Analyzer.Test.csproj(测试代码)
[Fact] public async Task MyTestMethod() { string test = @" using Framework; namespace MyNamespace; [Module] public class MyConcreteModule { } "; DiagnosticResult expected = VerifyCs .Diagnostic(AsyncPropertySetterAnalyzer.DiagnosticId) .WithLocation(line: 6, column: 0); await new CSharpAnalyzerTest<IsModuleAPublicClassAnalyzer, XUnitVerifier> { TestState = { Sources = { test }, ExpectedDiagnostics = { expected } } } .RunAsync(); }
所有项目均位于同一解决方案中,请问如何在测试代码的代码片段里引用Framework.dll?
更新1:添加MetadataReference后的版本冲突问题
我尝试通过添加额外的MetadataReference来引用Framework.dll,修改后的测试代码如下:
[Fact] public async Task MyTestMethod() { string test = @" using Framework; namespace MyNamespace; [Module] public class MyConcreteModule { } "; DiagnosticResult expected = VerifyCs .Diagnostic(AsyncPropertySetterAnalyzer.DiagnosticId) .WithLocation(line: 6, column: 0); await new CSharpAnalyzerTest<IsModuleAPublicClassAnalyzer, XUnitVerifier> { TestState = { Sources = { test }, ExpectedDiagnostics = { expected }, AdditionalReferences = { MetadataReference.CreateFromFile(typeof(ModuleAttribute).Assembly.Location) } } } .RunAsync(); }
但此时出现编译错误:
error CS1705: Assembly 'Framework' with identity 'Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=29fe1ef4929b04aa' uses 'System.Runtime, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' which has a higher version than referenced assembly 'System.Runtime' with identity 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
项目目标框架信息:
- Framework.csproj:net7.0
- Framework.Analyzer.Test.csproj:net7.0
- Framework.Analyzer.csproj:netstandard2.0
内容的提问来源于stack exchange,提问作者JakobFerdinand
相关产品推荐
相关产品推荐

