public static (SyntaxTree, SemanticModel) Compile(string classDeclaration, bool isCSharp = true, params AssemblyReference[] references) { using (var workspace = new AdhocWorkspace()) { var document = workspace.CurrentSolution.AddProject("project", "project.dll", isCSharp ? LanguageNames.CSharp : LanguageNames.VisualBasic) .AddMetadataReference(AssemblyReferenceService.GetMetadataReference(AssemblyReference.FromFramework("mscorlib.dll"))) .AddMetadataReference(AssemblyReferenceService.GetMetadataReference(AssemblyReference.FromFramework("System.dll"))) .AddMetadataReference(AssemblyReferenceService.GetMetadataReference(AssemblyReference.FromFramework("System.Core.dll"))) .AddMetadataReferences(references.Select(AssemblyReferenceService.GetMetadataReference)) .AddDocument("Class1", classDeclaration); var compilation = document.Project.GetCompilationAsync().Result; var tree = compilation.SyntaxTrees.First(); return(tree, compilation.GetSemanticModel(tree)); } }
private static Project CreateProject(string fileExtension, string assemblyName, AdhocWorkspace workspace, params AssemblyReference[] additionalReferences) { var language = fileExtension == CSharpFileExtension ? LanguageNames.CSharp : LanguageNames.VisualBasic; var project = workspace.CurrentSolution.AddProject(assemblyName, $"{assemblyName}.dll", language) .AddMetadataReference(AssemblyReferenceService.GetMetadataReference(AssemblyReference.FromFramework("mscorlib.dll"))) .AddMetadataReference(AssemblyReferenceService.GetMetadataReference(AssemblyReference.FromFramework("System.dll"))) .AddMetadataReference(AssemblyReferenceService.GetMetadataReference(AssemblyReference.FromFramework("System.Core.dll"))) .AddMetadataReferences(additionalReferences.Select(AssemblyReferenceService.GetMetadataReference)); // adding an extra file to the project // this won't trigger any issues, but it keeps a reference to the original ParseOption, so // if an analyzer/codefix changes the language version, Roslyn throws an ArgumentException project = project.AddDocument("ExtraEmptyFile.g" + fileExtension, string.Empty).Project; return(project); }