public static object Compile(SourceInfo sourceInfo) { var usings = new List <string>(); var allusingsInCode = sourceInfo.SourceCode.Split(new string[] { "using " }, StringSplitOptions.None); foreach (var item in allusingsInCode) { if (!String.IsNullOrWhiteSpace(item)) { usings.Add(item.Split(';')[0]); } } //var scriptOptions = ScriptOptions.Default.AddImports(usings); DownloadNugetPackages.DownloadAllPackages(sourceInfo.Nuget); var assemblies = DownloadNugetPackages.LoadPackages(sourceInfo.Nuget); ScriptOptions.Default.AddReferences(assemblies); var scriptOptions = ScriptOptions.Default.AddReferences(usings).AddReferences(assemblies); string result = ""; try { result = JsonConvert.SerializeObject(CSharpScript.EvaluateAsync(sourceInfo.SourceCode, scriptOptions).Result); var r = JsonConvert.SerializeObject(CSharpScript.RunAsync(sourceInfo.SourceCode, scriptOptions).Result); if (String.IsNullOrWhiteSpace(result) || result == "null") { result = r; } } catch (Exception ex) { result = ex.Message; } return(result); }
public static dynamic CompileRos(SourceInfo sourceInfo) { var usings = new List <string>(); var allusingsInCode = sourceInfo.SourceCode.Split(new string[] { "using " }, StringSplitOptions.None); foreach (var item in allusingsInCode) { if (!String.IsNullOrWhiteSpace(item)) { usings.Add(item.Split(';')[0]); } } List <Assembly> assemblies = new List <Assembly> { Assembly.Load("Microsoft.CodeAnalysis"), Assembly.Load("Microsoft.CodeAnalysis.CSharp"), Assembly.Load("Microsoft.CodeAnalysis.Features"), Assembly.Load("Microsoft.CodeAnalysis.CSharp.Features"), }; var assembliesList = DownloadNugetPackages.LoadPackages(sourceInfo.Nuget); foreach (var item in assembliesList) { var fname = item.FullName.Split(',')[0]; if (assemblies.Where(x => x.FullName.Split(',')[0] == fname).FirstOrDefault() == null) { try { var asm = item.FullName.Split(',')[0]; var loadAssembly = Assembly.Load(asm); assemblies.Add(loadAssembly); } catch (Exception) { //assemblies.Add(item); } } } var assembliest = AppDomain.CurrentDomain.GetAssemblies() .Where(a => !a.IsDynamic && File.Exists(a.Location)); //MefHostServices.DefaultAssemblies.AddRange (assembliest); var partTypes = MefHostServices.DefaultAssemblies.Concat(assemblies) .Distinct()? .SelectMany(x => x?.GetTypes())? .ToArray(); var compositionContext = new ContainerConfiguration() .WithParts(partTypes) //.WithAssemblies(assemblies) //.WithAssemblies(assembliest) .CreateContainer(); var host = MefHostServices.Create(compositionContext); var workspace = new AdhocWorkspace(host); var scriptCode = sourceInfo.SourceCode;// "Guid.N"; var _ = typeof(Microsoft.CodeAnalysis.CSharp.Formatting.CSharpFormattingOptions); var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, usings: usings); if (_ref == null || _ref.Length == 0) { //.GroupBy(a => a.GetName().Name) //.Select(grp => // grp.First(y => y.GetName().Version == grp.Max(x => x.GetName().Version))) //.Select(a => MetadataReference.CreateFromFile(a.Location)); MetadataReference[] _refs2 = assembliest .Select(asm => MetadataReference.CreateFromFile(asm.Location)) .ToArray(); MetadataReference[] _refs = assembliesList .Select(asm => MetadataReference.CreateFromFile(asm.Location)) .ToArray(); _ref = new MetadataReference[0]; try { try { foreach (var item in DependencyContext.Default.CompileLibraries) { try { var arr = item.ResolveReferencePaths().Select(asm => MetadataReference.CreateFromFile(asm))? .ToArray(); _ref = _ref.Concatenate(arr); } catch (Exception) { } } } catch (Exception) { } } catch (Exception) { } _ref = _ref.Concatenate(_refs); _ref = _ref.Concatenate(_refs2); } if (_ref != null && _ref.Length > 0) { _ref = _ref.Concatenate(new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) }); var scriptProjectInfo = ProjectInfo.Create(ProjectId.CreateNewId(), VersionStamp.Create(), "Script", "Script", LanguageNames.CSharp, isSubmission: true) .WithMetadataReferences(_ref) .WithCompilationOptions(compilationOptions); var scriptProject = workspace.AddProject(scriptProjectInfo); var scriptDocumentInfo = DocumentInfo.Create( DocumentId.CreateNewId(scriptProject.Id), "Script", sourceCodeKind: SourceCodeKind.Script, loader: TextLoader.From(TextAndVersion.Create(SourceText.From(scriptCode), VersionStamp.Create()))); var scriptDocument = workspace.AddDocument(scriptDocumentInfo); // cursor position is at the end var position = sourceInfo.LineNumberOffsetFromTemplate;// scriptCode.Length - 1; var completionService = CompletionService.GetService(scriptDocument); var results = completionService.GetCompletionsAsync(scriptDocument, position).Result; if (results == null && sourceInfo.LineNumberOffsetFromTemplate < sourceInfo.SourceCode.Length) { sourceInfo.LineNumberOffsetFromTemplate++; CompileRos(sourceInfo); } if (sourceInfo.SourceCode[sourceInfo.LineNumberOffsetFromTemplate - 1].ToString() == "(") { sourceInfo.LineNumberOffsetFromTemplate--; //CompileRos(sourceInfo); results = completionService.GetCompletionsAsync(scriptDocument, sourceInfo.LineNumberOffsetFromTemplate).Result; } //Method parameters List <string> overloads = GetMethodParams(scriptCode, position); if (overloads != null && overloads.Count > 0) { ImmutableArray <CompletionItem> .Builder builder = ImmutableArray.CreateBuilder <CompletionItem>(); foreach (var item in overloads) { string DisplayText = item; string insertText = item.Split('(')[1].Split(')')[0]; CompletionItem ci = CompletionItem.Create(insertText, insertText, insertText); builder.Add(ci); } if (builder.Count > 0) { ImmutableArray <CompletionItem> itemlist = builder.ToImmutable(); return(CompletionList.Create(new Microsoft.CodeAnalysis.Text.TextSpan(), itemlist)); } } return(results); } return(null); }
public static dynamic CompileRos2(SourceInfo sourceInfo) { List <Assembly> assemblies = new List <Assembly> { Assembly.Load("Microsoft.CodeAnalysis"), Assembly.Load("Microsoft.CodeAnalysis.CSharp"), Assembly.Load("Microsoft.CodeAnalysis.Features"), Assembly.Load("Microsoft.CodeAnalysis.CSharp.Features"), }; var assembliesList = DownloadNugetPackages.LoadPackages(sourceInfo.Nuget); foreach (var item in assembliesList) { var fname = item.FullName.Split(',')[0]; if (assemblies.Where(x => x.FullName.Split(',')[0] == fname).FirstOrDefault() == null) { var loadAssembly = Assembly.Load(item.FullName.Split(',')[0]); assemblies.Add(loadAssembly); } } var partTypes = MefHostServices.DefaultAssemblies.Concat(assemblies) .Distinct() .SelectMany(x => x.GetTypes()) .ToArray(); var compositionContext = new ContainerConfiguration() .WithParts(partTypes) //.WithAssemblies(assemblies) .CreateContainer(); var host = MefHostServices.Create(compositionContext); var workspace = new AdhocWorkspace(host); var scriptCode = sourceInfo.SourceCode;// "Guid.N"; var _ = typeof(Microsoft.CodeAnalysis.CSharp.Formatting.CSharpFormattingOptions); var usings = new List <string>(); var allusingsInCode = sourceInfo.SourceCode.Split(new string[] { "using " }, StringSplitOptions.None); foreach (var item in allusingsInCode) { if (!String.IsNullOrWhiteSpace(item)) { usings.Add(item.Split(';')[0]); } } var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, usings: usings); MetadataReference[] _ref = DependencyContext.Default.CompileLibraries .First(cl => cl.Name == "mssqlrestapi") .ResolveReferencePaths() .Select(asm => MetadataReference.CreateFromFile(asm)) .ToArray(); MetadataReference[] _refs = assembliesList .Select(asm => MetadataReference.CreateFromFile(asm.Location)) .ToArray(); MetadataReference[] newArray = new MetadataReference[_ref.Length + _refs.Length]; Array.Copy(_ref, newArray, _ref.Length); Array.Copy(_refs, 0, newArray, _ref.Length, _refs.Length); //assembliesList //IMethodSymbol methodWithGenericTypeArgsSymbol = simpleClassToAnalyze.GetMembers("MySimpleMethod").FirstOrDefault() as IMethodSymbol; //var genericMethodSignature = methodWithGenericTypeArgsSymbol.Parameters; var scriptProjectInfo = ProjectInfo.Create(ProjectId.CreateNewId(), VersionStamp.Create(), "Script", "Script", LanguageNames.CSharp, isSubmission: true) .WithMetadataReferences(newArray) .WithCompilationOptions(compilationOptions); // without .net asseblies // .WithMetadataReferences(new[] // { // MetadataReference.CreateFromFile(typeof(object).Assembly.Location) // }) var scriptProject = workspace.AddProject(scriptProjectInfo); var scriptDocumentInfo = DocumentInfo.Create( DocumentId.CreateNewId(scriptProject.Id), "Script", sourceCodeKind: SourceCodeKind.Script, loader: TextLoader.From(TextAndVersion.Create(SourceText.From(scriptCode), VersionStamp.Create()))); var scriptDocument = workspace.AddDocument(scriptDocumentInfo); // cursor position is at the end var position = sourceInfo.LineNumberOffsetFromTemplate;// scriptCode.Length - 1; var completionService = CompletionService.GetService(scriptDocument); var results = completionService.GetCompletionsAsync(scriptDocument, position).Result; if (results == null && sourceInfo.LineNumberOffsetFromTemplate < sourceInfo.SourceCode.Length) { sourceInfo.LineNumberOffsetFromTemplate++; CompileRos2(sourceInfo); } //Method parameters List <string> overloads = GetMethodParams(scriptCode, position); if (overloads != null && overloads.Count > 0) { ImmutableArray <CompletionItem> .Builder builder = ImmutableArray.CreateBuilder <CompletionItem>(); foreach (var item in overloads) { string DisplayText = item; string insertText = item.Split('(')[1].Split(')')[0]; CompletionItem ci = CompletionItem.Create(insertText, insertText, insertText); builder.Add(ci); } if (builder.Count > 0) { ImmutableArray <CompletionItem> itemlist = builder.ToImmutable(); return(CompletionList.Create(new Microsoft.CodeAnalysis.Text.TextSpan(), itemlist)); } } return(results);// JsonConvert.SerializeObject(results); }