using System; using System.CodeDom.Compiler; using System.Collections.Concurrent; using System.Collections.Generic; using System.Reflection; using System.Text; using Microsoft.CSharp; namespace BITKit { public class BITSharp { public static readonly List ReferencedAssemblies = new(); private static readonly ConcurrentDictionary Dictionary = new(); private static Assembly[] assemblies; public static bool TryGetTypeFromFullName(string fullClassName,out Type type) { type = GetTypeFromFullName(fullClassName); return type is not null ? true : false; } public static Type GetTypeFromFullName(string fullClassName) { return Dictionary.GetOrAdd(fullClassName, SearchType); } private static Type SearchType(string fullName) { assemblies = assemblies??AppDomain.CurrentDomain.GetAssemblies(); foreach (var assembly in assemblies) { var type = assembly.GetType(fullName,false); if (type is not null) { return type; } else { continue; } } return null; } #if UNITY_64 public static Assembly Compile(params string[] codes) { var codeProvider = new CSharpCodeProvider(); var parameters = new CompilerParameters { GenerateInMemory = true, CompilerOptions = "/unsafe" }; parameters.ReferencedAssemblies.Add("System.dll"); foreach (var x in ReferencedAssemblies) { parameters.ReferencedAssemblies.Add(x); } var results = codeProvider.CompileAssemblyFromSource(parameters, codes); if (results.Errors.Count <= 0) { BIT4Log.Log($"编译成功:{results.CompiledAssembly.FullName}"); return results.CompiledAssembly; } foreach (CompilerError error in results.Errors) { var sb = new StringBuilder(); sb.AppendLine(error.FileName); sb.AppendLine($"Error ({error.ErrorNumber}): {error.ErrorText}"); sb.AppendLine($"Line: {error.Line}, Column: {error.Column}"); sb.AppendLine($"Is Warning: {error.IsWarning}"); BIT4Log.LogException(new Exception(sb.ToString())); } throw new Exception("编译失败"); // object o = results.CompiledAssembly.CreateInstance("RuntimeCompiledNamespace.RuntimeCompiledClass"); // MethodInfo mi = o.GetType().GetMethod("RuntimeCompiledMethod"); // mi.Invoke(o, null); } #endif } }