123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834 |
- #if NETSTANDARD2_0 || NETSTANDARD2_1 || NETCOREAPP
- using Microsoft.CodeAnalysis;
- using System;
- using System.IO;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using System.Reflection;
- using System.Linq;
- using System.Reflection.Metadata;
- using System.Diagnostics;
- using System.ComponentModel;
- using System.Runtime.InteropServices;
- using System.Threading;
- using System.Threading.Tasks;
- using Microsoft.CodeAnalysis.Emit;
- using System.Globalization;
- #if NETCOREAPP
- using System.Runtime.Loader;
- #endif
- namespace FastReport.Code.CodeDom.Compiler
- {
- public abstract class CodeDomProvider : IDisposable
- {
- static readonly Dictionary<string, MetadataReference> cache = new Dictionary<string, MetadataReference>();
- /// <summary>
- /// Throws before compilation emit
- /// </summary>
- public event EventHandler<CompilationEventArgs> BeforeEmitCompilation;
- /// <summary>
- /// Manual resolve MetadataReference
- /// </summary>
- [Obsolete("Use AssemblyLoadResolver")]
- [EditorBrowsable(EditorBrowsableState.Never)]
- public static Func<AssemblyName, MetadataReference> ResolveMetadataReference { get; set; }
- /// <summary>
- /// Manual resolve MetadataReference
- /// </summary>
- public static IAssemblyLoadResolver AssemblyLoadResolver { get; set; }
- /// <summary>
- /// For developers only
- /// </summary>
- [EditorBrowsable(EditorBrowsableState.Never)]
- public static event EventHandler<string> Log;
- #if NETCOREAPP
- /// <summary>
- /// If these assemblies were not found when 'trimmed', then skip them
- /// </summary>
- private static readonly string[] SkippedAssemblies = new string[] {
- "System",
- "System.Core",
- "System.Drawing",
- //"System.Drawing.Primitives",
- "System.Data",
- "System.Xml",
- "System.Private.CoreLib",
- };
- #endif
- private static readonly string[] _additionalAssemblies = new[] {
- "mscorlib",
- "netstandard",
- "System.Core",
- "System.Collections.Concurrent",
- "System.Collections",
- "System.Collections.NonGeneric",
- "System.Collections.Specialized",
- "System.ComponentModel",
- "System.ComponentModel.Primitives",
- "System.Data.Common",
- #if !SKIA
- "System.Drawing.Common",
- #endif
- "System.Globalization",
- "System.IO",
- "System.Linq",
- "System.Linq.Expressions",
- "System.Linq.Parallel",
- "System.Linq.Queryable",
- "System.Numerics",
- "System.Runtime",
- "System.Text.Encoding",
- "System.Text.RegularExpressions"
- };
- [Conditional("DEBUG")] // Comment for use log messages in Release configuration
- protected static void DebugMessage(string message)
- {
- Debug.WriteLine(message);
- Console.WriteLine(message);
-
- Log?.Invoke(null, message);
- }
- protected void AddReferences(CompilerParameters cp, List<MetadataReference> references)
- {
- foreach (string reference in cp.ReferencedAssemblies)
- {
- DebugMessage($"TRY ADD '{reference}'");
- #if NETCOREAPP
- try
- {
- #endif
- var metadata = GetReference(reference);
- references.Add(metadata);
- #if NETCOREAPP
- }
- catch (FileNotFoundException)
- {
- DebugMessage($"{reference} FileNotFound");
- string assemblyName = GetCorrectAssemblyName(reference);
- if (SkippedAssemblies.Contains(assemblyName))
- {
- DebugMessage($"{reference} FileNotFound. SKIPPED");
- continue;
- }
- else
- {
- throw;
- }
- }
- #endif
- DebugMessage($"{reference} ADDED");
- }
- DebugMessage("AFTER ADDING ReferencedAssemblies");
- AddExtraAssemblies(cp.ReferencedAssemblies, references);
- }
- protected async ValueTask AddReferencesAsync(CompilerParameters cp, List<MetadataReference> references, CancellationToken cancellationToken)
- {
- foreach (string reference in cp.ReferencedAssemblies)
- {
- DebugMessage($"TRY ADD '{reference}'");
- #if NETCOREAPP
- try
- {
- #endif
- var metadata = await GetReferenceAsync(reference, cancellationToken);
- references.Add(metadata);
- #if NETCOREAPP
- }
- catch (FileNotFoundException)
- {
- DebugMessage($"{reference} FileNotFound");
- string assemblyName = GetCorrectAssemblyName(reference);
- if (SkippedAssemblies.Contains(assemblyName))
- {
- DebugMessage($"{reference} FileNotFound. SKIPPED");
- continue;
- }
- else
- {
- throw;
- }
- }
- #endif
- DebugMessage($"{reference} ADDED");
- }
- DebugMessage("AFTER ADDING ReferencedAssemblies");
- await AddExtraAssembliesAsync(cp.ReferencedAssemblies, references, cancellationToken);
- }
- protected void AddExtraAssemblies(StringCollection referencedAssemblies, List<MetadataReference> references)
- {
- DebugMessage("Add Extra Assemblies...");
- foreach(string assembly in _additionalAssemblies)
- {
- if (!referencedAssemblies.Contains(assembly))
- {
- #if NETCOREAPP
- try
- {
- #endif
- var metadata = GetReference(assembly);
- references.Add(metadata);
- #if NETCOREAPP
- }
- // If user run 'dotnet publish' with Trimmed - dotnet cut some extra assemblies.
- // We skip this error, because some assemblies in 'assemblies' array may not be needed
- catch (FileNotFoundException)
- {
- DebugMessage($"{assembly} FILENOTFOUND. SKIPPED");
- continue;
- }
- #endif
- }
- }
- }
- protected async ValueTask AddExtraAssembliesAsync(StringCollection referencedAssemblies, List<MetadataReference> references, CancellationToken ct)
- {
- DebugMessage("Add Extra Assemblies...");
- foreach (string assembly in _additionalAssemblies)
- {
- if (!referencedAssemblies.Contains(assembly))
- {
- #if NETCOREAPP
- try
- {
- #endif
- var metadata = await GetReferenceAsync(assembly, ct);
- references.Add(metadata);
- #if NETCOREAPP
- }
- // If user run 'dotnet publish' with Trimmed - dotnet cut some extra assemblies.
- // We skip this error, because some assemblies in 'assemblies' array may not be needed
- catch (FileNotFoundException)
- {
- DebugMessage($"{assembly} FILENOTFOUND. SKIPPED");
- continue;
- }
- #endif
- }
- }
- }
- private void OnBeforeEmitCompilation(Compilation compilation)
- {
- if (BeforeEmitCompilation != null)
- {
- var eventArgs = new CompilationEventArgs(compilation);
- BeforeEmitCompilation(this, eventArgs);
- }
- }
- public MetadataReference GetReference(string refDll)
- {
- if (cache.ContainsKey(refDll))
- return cache[refDll];
- MetadataReference result;
- string reference = GetCorrectAssemblyName(refDll);
- try
- {
- if (!refDll.Contains(Path.DirectorySeparatorChar))
- {
- #if NETCOREAPP
- // try find in AssemblyLoadContext
- foreach (AssemblyLoadContext assemblyLoadContext in AssemblyLoadContext.All)
- {
- foreach (Assembly loadedAssembly in assemblyLoadContext.Assemblies)
- {
- if (loadedAssembly.GetName().Name == reference)
- {
- DebugMessage($"FIND {reference} IN AssemblyLoadContext");
- result = ProcessAssembly(loadedAssembly);
- AddToCache(refDll, result);
- return result;
- }
- }
- }
- #else
- foreach (Assembly currAssembly in AppDomain.CurrentDomain.GetAssemblies())
- {
- if (string.Compare(currAssembly.GetName().Name, reference, true) == 0)
- {
- DebugMessage("FIND IN AppDomain");
- // Found it, return the location as the full reference.
- result = ProcessAssembly(currAssembly);
- AddToCache(refDll, result);
- return result;
- }
- }
- #endif
- // try find in ReferencedAssemblies
- foreach (AssemblyName name in Assembly.GetExecutingAssembly().GetReferencedAssemblies())
- {
- if (name.Name == reference)
- {
- DebugMessage($"FIND {reference} IN ReferencedAssemblies");
- #if NETCOREAPP
- // try load Assembly in runtime (for user script with custom assembly)
- var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(name);
- #else
- var assembly = Assembly.Load(name);
- #endif
- result = ProcessAssembly(assembly);
- AddToCache(refDll, result);
- return result;
- }
- }
- }
-
- result = MetadataReference.CreateFromFile(refDll);
- #if NETCOREAPP
- try
- {
- // try load Assembly in runtime (for user script with custom assembly)
- AssemblyLoadContext.Default.LoadFromAssemblyPath(refDll);
- }
- catch(ArgumentException) {
- var fullpath = Path.Combine(Environment.CurrentDirectory, refDll);
- try
- {
- AssemblyLoadContext.Default.LoadFromAssemblyPath(fullpath);
- }
- catch { }
- }
- catch { }
- #endif
- AddToCache(refDll, result);
- return result;
- }
- catch
- {
- DebugMessage("IN AssemblyName");
- var assemblyName = new AssemblyName(reference);
- result = UserResolveMetadataReference(assemblyName);
- if(result != null)
- {
- DebugMessage($"MetadataReference for assembly {reference} resolved by user");
- AddToCache(refDll, result);
- return result;
- }
- #if NETCOREAPP
- // try load Assembly in runtime (for user script with custom assembly)
- var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(assemblyName);
- #else
- var assembly = Assembly.Load(assemblyName);
- #endif
- DebugMessage("After LoadFromAssemblyName");
- result = ProcessAssembly(assembly);
- AddToCache(refDll, result);
- return result;
- }
- }
- private static async ValueTask<MetadataReference> GetReferenceAsync(string refDll, CancellationToken cancellationToken)
- {
- DebugMessage($"GetReferenceAsync: {refDll}");
- if (cache.ContainsKey(refDll))
- return cache[refDll];
- MetadataReference result;
- string reference = GetCorrectAssemblyName(refDll);
- try
- {
- if (!refDll.Contains(Path.DirectorySeparatorChar))
- {
- #if NETCOREAPP
- // try find in AssemblyLoadContext
- foreach (AssemblyLoadContext assemblyLoadContext in AssemblyLoadContext.All)
- {
- foreach (Assembly loadedAssembly in assemblyLoadContext.Assemblies)
- {
- if (loadedAssembly.GetName().Name == reference)
- {
- DebugMessage($"FIND {reference} IN AssemblyLoadContext");
- result = await ProcessAssemblyAsync(loadedAssembly, cancellationToken);
- AddToCache(refDll, result);
- return result;
- }
- }
- }
- #else
- foreach (Assembly currAssembly in AppDomain.CurrentDomain.GetAssemblies())
- {
- if (string.Compare(currAssembly.GetName().Name, reference, true) == 0)
- {
- DebugMessage("FIND IN AppDomain");
- // Found it, return the location as the full reference.
- result = await ProcessAssemblyAsync(currAssembly, cancellationToken);
- AddToCache(refDll, result);
- return result;
- }
- }
- #endif
- // try find in ReferencedAssemblies
- foreach (AssemblyName name in Assembly.GetExecutingAssembly().GetReferencedAssemblies())
- {
- if (name.Name == reference)
- {
- DebugMessage($"FIND {reference} IN ReferencedAssemblies");
- #if NETCOREAPP
- // try load Assembly in runtime (for user script with custom assembly)
- var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(name);
- #else
- var assembly = Assembly.Load(name);
- #endif
- result = await ProcessAssemblyAsync(assembly, cancellationToken);
- AddToCache(refDll, result);
- return result;
- }
- }
- }
- result = MetadataReference.CreateFromFile(refDll);
- #if NETCOREAPP
- try
- {
- // try load Assembly in runtime (for user script with custom assembly)
- AssemblyLoadContext.Default.LoadFromAssemblyPath(refDll);
- }
- catch(ArgumentException) {
- var fullpath = Path.Combine(Environment.CurrentDirectory, refDll);
- try
- {
- AssemblyLoadContext.Default.LoadFromAssemblyPath(fullpath);
- }
- catch { }
- }
- catch { }
- #endif
- AddToCache(refDll, result);
- return result;
- }
- catch
- {
- DebugMessage("IN AssemblyName");
- var assemblyName = new AssemblyName(reference);
- result = await UserResolveMetadataReferenceAsync(assemblyName, cancellationToken);
- if (result != null)
- {
- DebugMessage($"MetadataReference for assembly {reference} resolved by user");
- AddToCache(refDll, result);
- return result;
- }
- #if NETCOREAPP
- // try load Assembly in runtime (for user script with custom assembly)
- var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(assemblyName);
- #else
- var assembly = Assembly.Load(assemblyName);
- #endif
- DebugMessage("After LoadFromAssemblyName");
- result = await ProcessAssemblyAsync(assembly, cancellationToken);
- AddToCache(refDll, result);
- return result;
- }
- }
- private static MetadataReference UserResolveMetadataReference(AssemblyName assembly)
- {
- if(AssemblyLoadResolver != null)
- {
- return AssemblyLoadResolver.LoadManagedLibrary(assembly);
- }
- if (ResolveMetadataReference == null)
- return null;
- return ResolveMetadataReference(assembly);
- }
- private static async ValueTask<MetadataReference> UserResolveMetadataReferenceAsync(AssemblyName assembly, CancellationToken ct)
- {
- if (AssemblyLoadResolver != null)
- {
- return await AssemblyLoadResolver.LoadManagedLibraryAsync(assembly, ct);
- }
- return null;
- }
- private static MetadataReference ProcessAssembly(Assembly assembly)
- {
- MetadataReference result;
- DebugMessage($"Location: {assembly.Location}");
- #if NETCOREAPP
- // In SFA location is empty
- // In WASM location is empty
- // In Android DEBUG location is correct (not empty)
- // In Android RELEASE (AOT) location is not empty but incorrect
- if (SpecialCondition(assembly))
- {
- DebugMessage("SpecialCondition is true");
- result = GetMetadataReferenceSpecialized(assembly);
- return result;
- }
- #endif
- result = MetadataReference.CreateFromFile(assembly.Location);
- return result;
- }
- private static async ValueTask<MetadataReference> ProcessAssemblyAsync(Assembly assembly, CancellationToken ct)
- {
- MetadataReference result;
- DebugMessage($"Location: {assembly.Location}");
- #if NETCOREAPP
- // In SFA location is empty
- // In WASM location is empty
- // In Android DEBUG location is correct (not empty)
- // In Android RELEASE (AOT) location is not empty but incorrect
- if (SpecialCondition(assembly))
- {
- DebugMessage("SpecialCondition is true");
- result = await GetMetadataReferenceSpecializedAsync(assembly, ct);
- return result;
- }
- #endif
- result = MetadataReference.CreateFromFile(assembly.Location);
- return result;
- }
- #if NETCOREAPP
- private static bool SpecialCondition(Assembly assembly)
- {
- string location = assembly.Location;
- DebugMessage($"assemblyName Name {assembly.GetName().Name}");
- bool result = string.IsNullOrEmpty(location)
- #if NET6_0_OR_GREATER // ANDROID_BUILD || IOS_BUILD
- || location.StartsWith(assembly.GetName().Name)
- #endif
- ;
- return result;
- }
- private static MetadataReference GetMetadataReferenceSpecialized(Assembly assembly)
- {
- MetadataReference result;
- try
- {
- result = GetMetadataReferenceInSingleFileApp(assembly);
- }
- catch (NotImplementedException)
- {
- DebugMessage("Not implemented assembly load from SFA");
- // try load from external source
- result = UserResolveMetadataReference(assembly.GetName());
- if(result == null)
- throw;
- }
- return result;
- }
- private static async ValueTask<MetadataReference> GetMetadataReferenceSpecializedAsync(Assembly assembly, CancellationToken ct)
- {
- MetadataReference result;
- try
- {
- result = GetMetadataReferenceInSingleFileApp(assembly);
- }
- catch (NotImplementedException)
- {
- DebugMessage("Not implemented assembly load from SFA");
- // try load from external source
- result = await UserResolveMetadataReferenceAsync(assembly.GetName(), ct);
- if (result == null)
- throw;
- }
- return result;
- }
- private static unsafe MetadataReference GetMetadataReferenceInSingleFileApp(Assembly assembly)
- {
- DebugMessage($"TRY IN UNSAFE METHOD {assembly.GetName().Name}");
- assembly.TryGetRawMetadata(out byte* blob, out int length);
- var moduleMetadata = ModuleMetadata.CreateFromMetadata((IntPtr)blob, length);
- var assemblyMetadata = AssemblyMetadata.Create(moduleMetadata);
- return assemblyMetadata.GetReference();
- }
- #endif
- public static string TryFixReferenceInSingeFileApp(Assembly assembly)
- {
- #if NETCOREAPP
- try
- {
- string assemblyName = assembly.GetName().Name;
- if (!cache.ContainsKey(assemblyName))
- {
- MetadataReference metadataReference = GetMetadataReferenceSpecialized(assembly);
- AddToCache(assemblyName, metadataReference);
- }
- return assemblyName;
- }
- catch (Exception ex)
- {
- DebugMessage(ex.ToString());
- }
- #endif
- return null;
- }
- public static async ValueTask<string> TryFixReferenceInSingeFileAppAsync(Assembly assembly, CancellationToken ct)
- {
- #if NETCOREAPP
- try
- {
- string assemblyName = assembly.GetName().Name;
- if (!cache.ContainsKey(assemblyName))
- {
- MetadataReference metadataReference = await GetMetadataReferenceSpecializedAsync(assembly, ct);
- AddToCache(assemblyName, metadataReference);
- }
- return assemblyName;
- }
- catch (Exception ex)
- {
- DebugMessage(ex.ToString());
- }
- #endif
- return null;
- }
- private static void AddToCache(string refDll, MetadataReference metadata)
- {
- cache[refDll] = metadata;
- }
- private static string GetCorrectAssemblyName(string reference)
- {
- string assemblyName = reference.EndsWith(".dll") || reference.EndsWith(".exe") ?
- reference.Substring(0, reference.Length - 4) : reference;
- return assemblyName;
- }
- // backward compabilty
- public CompilerResults CompileAssemblyFromSource(CompilerParameters cp, string code)
- {
- return CompileAssemblyFromSource(cp, code, null);
- }
- public CompilerResults CompileAssemblyFromSource(CompilerParameters cp, string code, CultureInfo cultureInfo = null)
- {
- DebugMessage(typeof(SyntaxTree).Assembly.FullName);
- DebugMessage($"threadId: {Environment.CurrentManagedThreadId}");
- #if NET6_0_OR_GREATER
- DebugMessage($"rid: {RuntimeInformation.RuntimeIdentifier} " +
- $"arch: {RuntimeInformation.ProcessArchitecture} " +
- $"os-arch: {RuntimeInformation.OSArchitecture} " +
- $"os: {RuntimeInformation.OSDescription}");
- #endif
- DebugMessage("FR.Compat: " +
- #if NETSTANDARD
- "NETSTANDARD"
- #elif NETCOREAPP
- "NETCOREAPP"
- #endif
- );
- SyntaxTree codeTree = ParseTree(code);
- List<MetadataReference> references = new List<MetadataReference>();
- AddReferences(cp, references);
- DebugMessage($"References count: {references.Count}");
- //foreach (var reference in references)
- // DebugMessage($"{reference.Display}");
- Compilation compilation = CreateCompilation(codeTree, references);
- OnBeforeEmitCompilation(compilation);
- return Emit(compilation, cultureInfo);
- }
- public async Task<CompilerResults> CompileAssemblyFromSourceAsync(CompilerParameters cp, string code, CultureInfo cultureInfo = null, CancellationToken cancellationToken = default)
- {
- DebugMessage(typeof(SyntaxTree).Assembly.FullName);
- DebugMessage($"threadId: {Environment.CurrentManagedThreadId}");
- #if NET6_0_OR_GREATER
- DebugMessage($"rid: {RuntimeInformation.RuntimeIdentifier} " +
- $"arch: {RuntimeInformation.ProcessArchitecture} " +
- $"os-arch: {RuntimeInformation.OSArchitecture} " +
- $"os: {RuntimeInformation.OSDescription}");
- #endif
- DebugMessage("FR.Compat: " +
- #if NETSTANDARD
- "NETSTANDARD"
- #elif NETCOREAPP
- "NETCOREAPP"
- #endif
- );
- SyntaxTree codeTree = ParseTree(code, cancellationToken);
- List<MetadataReference> references = new List<MetadataReference>();
- await AddReferencesAsync(cp, references, cancellationToken);
- DebugMessage($"References count: {references.Count}");
- //foreach (var reference in references)
- // DebugMessage($"{reference.Display}");
- Compilation compilation = CreateCompilation(codeTree, references);
- OnBeforeEmitCompilation(compilation);
- return await EmitAsync(compilation, cultureInfo, cancellationToken);
- }
- protected abstract Compilation CreateCompilation(SyntaxTree codeTree, ICollection<MetadataReference> references);
- protected abstract SyntaxTree ParseTree(string text, CancellationToken ct = default);
- public abstract void Dispose();
- private static CompilerResults Emit(Compilation compilation, CultureInfo cultureInfo, CancellationToken ct = default)
- {
- using (MemoryStream ms = new MemoryStream())
- {
- DebugMessage("Emit...");
- //DebugMessage(code);
- DebugMessage($"threadId: {Environment.CurrentManagedThreadId}");
- EmitResult results = compilation.Emit(ms,
- cancellationToken: ct);
- return HandleEmitResult(results, ms, cultureInfo);
- }
- }
- private static async Task<CompilerResults> EmitAsync(Compilation compilation, CultureInfo cultureInfo, CancellationToken ct = default)
- {
- using (MemoryStream ms = new MemoryStream())
- {
- DebugMessage("Emit...");
- //DebugMessage(code);
- // we use Task.Run because in Wasm Emit throws an exception in current context
- EmitResult results = await Task.Run(() => compilation.Emit(ms,
- cancellationToken: ct), ct);
- return HandleEmitResult(results, ms, cultureInfo);
- }
- }
- private static CompilerResults HandleEmitResult(EmitResult results, MemoryStream ms, CultureInfo cultureInfo)
- {
- if (results.Success)
- {
- #if DEBUG
- foreach (Diagnostic d in results.Diagnostics)
- if (d.Severity > DiagnosticSeverity.Hidden)
- DebugMessage($"Compiler {d.Severity}: {d.GetMessage()}. Line: {d.Location}");
- #endif
- ms.Position = 0;
- Assembly compiledAssembly = null;
- #if NETCOREAPP
- foreach (var assemblyLoadContext in AssemblyLoadContext.All)
- {
- if (assemblyLoadContext.Assemblies.Any(assembly => assembly == typeof(CodeDomProvider).Assembly))
- {
- compiledAssembly = assemblyLoadContext.LoadFromStream(ms);
- }
- }
- if (compiledAssembly == null)
- compiledAssembly = AssemblyLoadContext.Default.LoadFromStream(ms);
- #else
- compiledAssembly = Assembly.Load(ms.ToArray());
- #endif
- return new CompilerResults(compiledAssembly);
- }
- else
- {
- DebugMessage($"results not success, {ms.Length}");
- CompilerResults result = new CompilerResults();
- foreach (Diagnostic d in results.Diagnostics)
- {
- if (d.Severity == DiagnosticSeverity.Error)
- {
- DebugMessage(d.GetMessage());
- var position = d.Location.GetLineSpan().StartLinePosition;
- result.Errors.Add(new CompilerError()
- {
- ErrorText = d.GetMessage(cultureInfo),
- ErrorNumber = d.Id,
- Line = position.Line,
- Column = position.Character,
- });
- }
- }
- return result;
- }
- }
- }
- }
- #endif
|