/// <summary> /// Инициализирует новый экземпляр класса <see cref="Compiler"/> /// </summary> /// <param name="Language">Язык программирования, используемый для сборки проекта</param> public Compiler(CompilerLanguage Language) { // Установка языка программирования обрабатываемый компилятором this.Language = Language; // Установка параметров компилятора по умолчанию this.Parameters = new CompilerParameters { // Создаётся исполняемый файл вместо библиотеки классов. GenerateExecutable = true, // Создание отладочной информации. IncludeDebugInformation = false, // Сохранение сборки, как физический файл. GenerateInMemory = true, // Уровень, на котором компилятор должен начать отображать предупреждения. WarningLevel = 4, // Рассмотр всех предупреждений как ошибки. TreatWarningsAsErrors = false, // Аргумент компилятора для оптимизации вывода. // "/optimize" - Включает (или отключает) оптимизацию. // "/platform" - Пределы, какие платформы этот код можно запускать на: x86, Itanium, x64, AnyCPU или anycpu32bitpreferred. По умолчанию AnyCPU. // "/target" - Задает формат выходного файла с помощью одного из четырех вариантов: /target:appcontainerexe, /target:exe, /target:library, /target:module, /target:winexe, /target:winmdobj. // "/unsafe" - Позволяет небезопасный код. CompilerOptions = "/optimize" }; }
/// <summary> /// Сохраняет данные в файл "Resources.Designer.*". /// </summary> /// <param name="File">Расположение файла</param> /// <param name="Assembly">Имя сборки</param> /// <param name="Language">Язык программирования</param> public void Save(String File, String Assembly, CompilerLanguage Language) { using (FileStream FS = new FileStream(File, FileMode.Create)) { Byte[] Buffer = new UTF8Encoding(true).GetBytes(ToString(Assembly, Language)); FS.Write(Buffer, 0, Buffer.Length); FS.Close(); FS.Dispose(); } }
/// <summary> /// Gets path to compiler. /// </summary> /// <param name="lang"></param> /// <returns></returns> public static string GetPath(CompilerLanguage lang) { string name = GetFileName(lang); var dirs = lang == CompilerLanguage.FSharp ? FSharpDirs : FrameworkRoots(); return(dirs.Where(dir => Directory.Exists(dir)) .Select(dir => Path.Combine(dir, name)) .FirstOrDefault(path => File.Exists(path)) ?? ""); }
static string GetFileName(CompilerLanguage lang) { switch (lang) { case CompilerLanguage.CSharp: return("csc.exe"); case CompilerLanguage.VB: return("vbc.exe"); case CompilerLanguage.JSharp: return("jsc.exe"); case CompilerLanguage.FSharp: return("fsc.exe"); default: throw new ArgumentOutOfRangeException("lang"); } }
public static string SimpleRun(CompilerLanguage lang, string input, string output, bool debug, bool optimize) { var options = new CompilerOptions { Language = lang, Debug = debug, Optimize = optimize, Unsafe = true }; options.Input.Add(input); options.Output = output; string res = Run(options, true); if (HasErrors(res)) { return(res); } return(null); }
/// <summary> /// Инициализирует новый экземпляр класса <see cref="Project"/> /// </summary> /// <param name="Name">Имя сборки</param> /// <param name="Language">Язык программирования</param> public Project(String Name, CompilerLanguage Language) { this.Name = Name.Replace(new Char[] { ' ', '?', '!', '@', '`', '~', '$', '%', '^', ':', '&', '*', '(', ')', '=', '+', '<', '>', ',', '/', '\\', '\"', '«', '»', '—', '-', '№', '#' }, '_'); this.Language = Language; // Установка списка связанных сборок по умолчанию ReferencedAssemblies = new List <String>() { "mscorlib.dll", "Microsoft.CSharp.dll", "System.dll", "System.Core.dll", "System.Data.dll", "System.Data.DataSetExtensions.dll", "System.Deployment.dll", "System.Drawing.dll", "System.Net.Http.dll", "System.Windows.Forms.dll", "System.Xml.dll", "System.Xml.Linq.dll", }; }
/// <summary> /// Преобразует значение данного экземпляра в еквивалентное ему строковое представление. /// </summary> /// <param name="Assembly">Имя сборки</param> /// <param name="Language">Язык программирования</param> /// <returns></returns> public String ToString(String Assembly, CompilerLanguage Language) { List <String> Result; switch (Language) { case CompilerLanguage.CSharp: Result = new List <String>() { "namespace " + Assembly + ".Properties", "{", " /// <summary>", " /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.", " /// </summary>", " [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]", " [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]", " [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]", " internal class Resources", " {", " private static global::System.Resources.ResourceManager resourceMan;", " private static global::System.Globalization.CultureInfo resourceCulture;", "", " [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]", " internal Resources() { }", "", " /// <summary>", " /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.", " /// </summary>", " [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]", " internal static global::System.Resources.ResourceManager ResourceManager", " {", " get", " {", " if (object.ReferenceEquals(resourceMan, null))", " {", " global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"" + Assembly + ".Properties.Resources\", typeof(Resources).Assembly);", " resourceMan = temp;", " }", " return resourceMan;", " }", " }", "", " /// <summary>", " /// Перезаписывает свойство CurrentUICulture текущего потока для всех обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.", " /// </summary>", " [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]", " internal static global::System.Globalization.CultureInfo Culture", " {", " get { return resourceCulture; }", " set { resourceCulture = value; }", " }" }; foreach (KeyValuePair <String, Object> Resource in List) { Result.Add(""); Result.Add(" /// <summary>"); Result.Add(" /// Поиск локализованного ресурса типа " + Resource.Value.GetType().ToString() + "."); Result.Add(" /// </summary>"); Result.Add(" internal static " + Resource.Value.GetType().ToString() + " " + Resource.Key + " {"); Result.Add(" get {"); Result.Add(" object obj = ResourceManager.GetObject(\"" + Resource.Key + "\", resourceCulture);"); Result.Add(" return ((" + Resource.Value.GetType().ToString() + ")(obj));"); Result.Add(" }"); Result.Add(" }"); } Result.Add(" }"); Result.Add("}"); break; case CompilerLanguage.Basic: Result = new List <String>() { "Option Strict On", "Option Explicit On", "", "Imports System", "", "Namespace My.Resources", "", " ''' <summary>", " ''' Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.", " ''' </summary>", " <Global.System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"15.0.0.0\"), _", " Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _", " Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _", " Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _", " Friend Module Resources", "", " Private resourceMan As Global.System.Resources.ResourceManager", " Private resourceCulture As Global.System.Globalization.CultureInfo", "", " ''' <summary>", " ''' Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.", " ''' </summary>", " <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _", " Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager", " Get", " If Object.ReferenceEquals(resourceMan, Nothing) Then", " Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager(\"" + Assembly + ".Resources\", GetType(Resources).Assembly)", " resourceMan = temp", " End If", " Return resourceMan", " End Get", " End Property", "", " ''' <summary>", " ''' Перезаписывает свойство CurrentUICulture текущего потока для всех обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.", " ''' </summary>", " <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _", " Friend Property Culture() As Global.System.Globalization.CultureInfo", " Get Return resourceCulture End Get", " Set resourceCulture = value End Set", " End Property" }; foreach (KeyValuePair <String, Object> Resource in List) { Result.Add(""); Result.Add(" ''' <summary>"); Result.Add(" ''' Поиск локализованного ресурса типа " + Resource.Value.GetType().ToString() + "."); Result.Add(" ''' </summary>"); Result.Add(" Friend ReadOnly Property " + Resource.Key + "() As " + Resource.Value.GetType().ToString() + ""); Result.Add(" Get"); Result.Add(" Dim obj As Object = ResourceManager.GetObject(\"" + Resource.Key + "\", resourceCulture)"); Result.Add(" Return CType(obj, " + Resource.Value.GetType().ToString() + ")"); Result.Add(" End Get"); Result.Add(" End Property"); } Result.Add(""); Result.Add(" End Module"); Result.Add("End Namespace"); break; default: return(this.GetType().ToString()); } return(Result.Aggregate("", (Content, Item) => Content += Item + Environment.NewLine)); }
/// <summary> /// initialize instance /// </summary> /// <param name="language">programming language type</param> /// <param name="sourceCode">source code text</param> public DynamicCompiler(CompilerLanguage language, string sourceCode) { intLanguage = language; strSourceCode = sourceCode; }
public CompilerSettings(CompilerLanguage compiler = CompilerLanguage.CSharp) { _compilerLang = compiler; }
private static void SetCompilerOptions(TestCase tc, CompilerLanguage lang, CompilerOptions options) { options.Language = lang; options.Debug = tc.Debug; options.Optimize = tc.Optimize; options.Unsafe = tc.Unsafe; options.Output = tc.ExePath; options.Target = CompilerTarget.ConsoleApp; options.NoLogo = true; options.Checked = false; options.Define("TARGET_JVM"); //to remove unsafe options.Define("NET_2_0"); options.Defines.AddRange(tc.Defines); if (tc.VM == VM.CLR) { options.Define("MSCLR"); } else if (tc.VM == VM.AVM) { options.Define("AVM"); } //common refs if (tc.VM == VM.AVM) { GlobalSettings.AddCommonReferences(options); options.AddRef(Path.Combine(GlobalSettings.LibsDirectory, "flash.v10.2.dll")); options.NoConfig = true; options.NoStdlib = true; if (lang == CompilerLanguage.VB) { //options.NoVBRuntime = true; options.VBRuntime = GlobalSettings.Libs.VBRuntime; //options.CompactFramework = true; options.SDKPath = GlobalSettings.Dirs.Libs; options.NoWarn = true; } } else { options.AddRef("System.Core.dll"); } if (tc.IsNUnit) { if (tc.VM == VM.CLR) { string nunit = QA.GetNUnitFrameworkPath(GlobalOptions.UseCommonDirectory ? "" : tc.Root); options.AddRef(nunit); } else { options.AddRef(GlobalSettings.GetLibPath(QA.NUnitFrameworkDll)); } options.AddRef(tc.GetNUnitTestsPath(tc.Root)); } options.Input.AddRange(tc.SourceFiles.Names); }
/// <summary> /// Преобразует значение данного экземпляра в еквивалентное ему строковое представление. /// </summary> /// <param name="Language">Язык программирования</param> /// <returns></returns> public String ToString(CompilerLanguage Language) { List <String> Result; switch (Language) { case CompilerLanguage.CSharp: Result = new List <String> { "using System.Reflection;", "using System.Runtime.CompilerServices;", "using System.Runtime.InteropServices;", "", "// Общие сведения об этой сборке предоставляются следующим набором набора атрибутов.", "// Измените значения этих атрибутов, чтобы изменить сведения, связанные со сборкой.", $"[assembly: AssemblyTitle(\"{this.Title}\")]", $"[assembly: AssemblyDescription(\"{this.Description}\")]", $"[assembly: AssemblyConfiguration(\"{this.Configuration}\")]", $"[assembly: AssemblyCompany(\"{this.Company}\")]", $"[assembly: AssemblyProduct(\"{this.Product}\")]", $"[assembly: AssemblyCopyright(\"{this.Copyright}\")]", $"[assembly: AssemblyTrademark(\"{this.Trademark}\")]", $"[assembly: AssemblyCulture(\"{this.Culture}\")]", "", "// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми для компонентов COM.", "// Если необходимо обратиться к типу в этой сборке через COM, задайте атрибуту ComVisible значение TRUE для этого типа.", $"[assembly: ComVisible({this.ComVisible.ToString().ToLower()})]", "", "// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM", "// [assembly: Guid(\"\")]", "", "// Сведения о версии сборки состоят из следующих четырех значений:", "//", "// Основной номер версии", "// Дополнительный номер версии", "// Номер сборки", "// Редакция", "//", "// Можно задать все значения или принять номер сборки и номер редакции по умолчанию, используя \"*\", как показано ниже:", "// [assembly: AssemblyVersion(\"1.0.*\")]", "", "// Сведения о версии сборки.", $"[assembly: AssemblyVersion(\"{this.Version.ToString()}\")]", $"[assembly: AssemblyFileVersion(\"{this.FileVersion.ToString()}\")]" }; break; case CompilerLanguage.Basic: Result = new List <String> { "Imports System", "Imports System.Reflection", "Imports System.Runtime.InteropServices", "", "' Общие сведения об этой сборке предоставляются следующим набором атрибутов.", "' Измените значения этих атрибутов, чтобы изменить общие сведения об этой сборке.", $"<Assembly: AssemblyTitle(\"{this.Title}\")>", $"<Assembly: AssemblyDescription(\"{this.Description}\")>", $"<assembly: AssemblyConfiguration(\"{this.Configuration}\")>", $"<Assembly: AssemblyCompany(\"{this.Company}\")>", $"<Assembly: AssemblyProduct(\"{this.Product}\")>", $"<Assembly: AssemblyCopyright(\"{this.Copyright}\")>", $"<Assembly: AssemblyTrademark(\"{this.Trademark}\")>", $"<assembly: AssemblyCulture(\"{this.Culture}\")>", "", $"<Assembly: ComVisible(\"{this.ComVisible.ToString().ToLower()}\")>", "", "' Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM", "' <Assembly: Guid(\"\")>", "", "' Сведения о версии сборки состоят из следующих четырех значений:", "'", "' Основной номер версии", "' Дополнительный номер версии", "' Номер сборки", "' Редакция", "'", "' Можно задать все значения или принять номер сборки и номер редакции по умолчанию, используя \"*\", как показано ниже:", "' <Assembly: AssemblyVersion(\"1.0.*\")>", "", $"<Assembly: AssemblyVersion(\"{this.Version.ToString()}\")>", $"<Assembly: AssemblyFileVersion(\"{this.FileVersion.ToString()}\")>", }; break; default: Result = new List <String> { $"Title: {this.Title}", $"Description: {this.Description}", $"Configuration: {this.Configuration}", $"Company: {this.Company}", $"Product: {this.Product}", $"Copyright: {this.Copyright}", $"Trademark: {this.Trademark}", $"Culture: {this.Culture}", "", $"ComVisible: {this.ComVisible.ToString().ToLower()}", "", $"Version: {this.Version.ToString()}", $"FileVersion: {this.FileVersion.ToString()}", }; break; } return(Result.Aggregate("", (Content, Item) => Content += Item + Environment.NewLine)); }