public static IControlScriptFactory Compile(string scriptCode)
        {
            var translatedCode            = GetTranslatedCode(scriptCode);
            var provider                  = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();
            CompilerParameters parameters = new CompilerParameters();

            parameters.ReferencedAssemblies.Add(typeof(ControlScriptCompiler).Assembly.Location);
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add(typeof(ControlScriptLibrary.ControlScriptLibrary).Assembly.Location);
            parameters.GenerateInMemory = true;
            parameters.CompilerOptions  = "/optimize";
            CompilerResults results = provider.CompileAssemblyFromSource(parameters, translatedCode);

            if (results.Errors.HasErrors)
            {
                throw new TranslatedCodeCompilationException()
                      {
                          Errors = results.Errors.Cast <CompilerError>().Select(x => x.ErrorText),
                      }
            }
            ;
            var cls = results.CompiledAssembly.GetType("ControlScript");

            return(new ControlScriptFactory(() => (IControlScript)cls.GetConstructors()[0].Invoke(null)));
        }
Exemplo n.º 2
0
        private Assembly GenerateAssembly(string sourceCode)
        {
            Environment.SetEnvironmentVariable("ROSLYN_COMPILER_LOCATION", @"C:\Code\ElasticSearchTalk\packages\Microsoft.Net.Compilers.2.9.0\tools", EnvironmentVariableTarget.Process);
            var _codeDomProvider    = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();
            var _compilerParameters = new CompilerParameters();

            _compilerParameters.ReferencedAssemblies.Add("system.dll");
            _compilerParameters.ReferencedAssemblies.Add("system.xml.dll");
            _compilerParameters.ReferencedAssemblies.Add("system.core.dll");
            _compilerParameters.ReferencedAssemblies.Add("system.linq.dll");
            _compilerParameters.ReferencedAssemblies.Add(@"C:\Code\ElasticSearchTalk\packages\NEST.6.1.0\lib\net46\Nest.dll");
            _compilerParameters.ReferencedAssemblies.Add(@"C:\Code\ElasticSearchTalk\NESTClient\bin\Debug\NESTClient.exe");
            _compilerParameters.GenerateExecutable      = false;
            _compilerParameters.GenerateInMemory        = true;
            _compilerParameters.IncludeDebugInformation = true;

            var _compilerResults = _codeDomProvider.CompileAssemblyFromSource(_compilerParameters, sourceCode);

            if (_compilerResults.Errors.HasErrors)
            {
                foreach (CompilerError err in _compilerResults.Errors)
                {
                    throw new InvalidScriptException(err.Line, err.Column, err.ErrorText, err.ErrorNumber);
                }
                throw new Exception("Compilation failed.");
            }

            return(_compilerResults.CompiledAssembly);
        }
Exemplo n.º 3
0
        private Assembly CompileCode(String Source, String ErrorPath, Func <int, String> TranslateBulkFilenames = null)
        {
            //CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");

            CodeDomProvider codeProvider = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();

            var parameters = new CompilerParameters();

            parameters.GenerateInMemory   = true;
            parameters.GenerateExecutable = false;

            parameters.ReferencedAssemblies.Add("mscorlib.dll");
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            parameters.ReferencedAssemblies.Add("System.Data.Linq.dll");
            parameters.ReferencedAssemblies.Add("core.dll");

            CompilerResults compilationResults = codeProvider.CompileAssemblyFromSource(parameters, Source);
            bool            realError          = false;

            if (compilationResults.Errors.Count > 0)
            {
                var errorString = new StringBuilder();
                errorString.AppendLine(String.Format("{0} errors in {1}", compilationResults.Errors.Count, ErrorPath));

                foreach (var error in compilationResults.Errors)
                {
                    var cError = error as System.CodeDom.Compiler.CompilerError;
                    if (!cError.IsWarning)
                    {
                        realError = true;
                    }

                    var filename = cError.FileName;
                    if (TranslateBulkFilenames != null)
                    {
                        filename = TranslateBulkFilenames(cError.Line);
                    }

                    errorString.Append(filename + " : " + error.ToString());
                    errorString.AppendLine();
                }
                Core.LogError(errorString.ToString());
            }

            if (realError)
            {
                return(null);
            }
            return(compilationResults.CompiledAssembly);
        }
        private static Assembly BuildAssembly(string code)
        {
            using (var compiler = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider())
            {
                //Clean up
                Environment.SetEnvironmentVariable("ROSLYN_COMPILER_LOCATION", null, EnvironmentVariableTarget.Process);

                var compilerparams = new CompilerParameters
                {
                    GenerateExecutable = false,
                    GenerateInMemory   = true,
                    CompilerOptions    = "/unsafe /optimize /langversion:8.0"
                };

                var assemblies = AppDomain.CurrentDomain
                                 .GetAssemblies()
                                 .Where(a => !a.IsDynamic)
                                 .Select(a => a.Location);

                var asmList = assemblies.ToList();
                asmList.RemoveAll(x => x.Contains(".winmd"));

                compilerparams.ReferencedAssemblies.AddRange(asmList.ToArray());

                CompilerResults results = compiler.CompileAssemblyFromSource(compilerparams, code);

                if (results.Errors.HasErrors)
                {
                    StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
                    foreach (CompilerError error in results.Errors)
                    {
                        errors.Append($"Line {error.Line},{error.Column}\t: {error.ErrorText}\n");
                    }

                    compiler.Dispose();

                    throw new Exception(errors.ToString());
                }
                else
                {
                    return(results.CompiledAssembly);
                }
            }
        }
        //https://stackoverflow.com/questions/31639602/using-c-sharp-6-features-with-codedomprovider-rosyln
        public void CompileCodeProgrammaticallyTest1_AfterCSharp6()
        {
            CompilerParameters parameters = new CompilerParameters();

            //parameters.GenerateExecutable = true;
            parameters.OutputAssembly     = @"c:\tmp\helloWorld-compiled-programmatically.exe";
            parameters.GenerateExecutable = true;
            //parameters.CompilerOptions = "-langversion:6";
            parameters.IncludeDebugInformation = true;
            parameters.GenerateInMemory        = false;
            parameters.TreatWarningsAsErrors   = false;
            parameters.WarningLevel            = 3;
            parameters.ReferencedAssemblies.Add("System.Runtime.dll");

            //V1 : après c#6 roslyn : v1
            //CodeDomProvider compiler = CodeProvider.Value;

            //V2 : après c#6 V2 : C:\Program Files (x86)\MSBuild\14.0\Bin\csc.exe
            //Set hardcoded environment variable to set the path to the library
            Environment.SetEnvironmentVariable("ROSLYN_COMPILER_LOCATION", @"C:\Program Files (x86)\MSBuild\14.0\Bin", EnvironmentVariableTarget.Process);
            //Create compiler object
            CSharpCodeProvider compiler = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();

            //Clean up
            Environment.SetEnvironmentVariable("ROSLYN_COMPILER_LOCATION", null, EnvironmentVariableTarget.Process);


            CompilerResults results = compiler.CompileAssemblyFromSource(parameters, SOURCE_STRING_C_SHARP_6);

            foreach (CompilerError error in results.Errors)
            {
                Console.WriteLine(error);
            }

            Check.That(results.PathToAssembly).IsEqualTo(@"c:\tmp\helloWorld-compiled-programmatically.exe");
            Check.That(results.Errors).CountIs(0);
            Check.That(results.Errors.HasErrors).IsFalse();
            Check.That(results.Errors.HasWarnings).IsFalse();
            Check.That(results.NativeCompilerReturnValue).IsEqualTo(0);
        }
Exemplo n.º 6
0
        public static CompilationResult Compile(IEnumerable <string> assemblies, string code)
        {
            return(resultCache.GetOrAdd(code, _ =>
            {
                using (HeavyProfiler.Log("COMPILE", () => code))
                {
                    try
                    {
                        CodeDomProvider supplier = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();

                        CompilerParameters parameters = new CompilerParameters();

                        parameters.ReferencedAssemblies.Add("System.dll");
                        parameters.ReferencedAssemblies.Add("System.Data.dll");
                        parameters.ReferencedAssemblies.Add("System.Core.dll");

                        foreach (var ass in assemblies)
                        {
                            parameters.ReferencedAssemblies.Add(ass);
                        }

                        parameters.GenerateInMemory = true;

                        CompilerResults compiled = supplier.CompileAssemblyFromSource(parameters, code);

                        if (compiled.Errors.HasErrors)
                        {
                            var lines = code.Split('\n');
                            var errors = compiled.Errors.Cast <CompilerError>();
                            return new CompilationResult
                            {
                                CompilationErrors = errors.Count() + " Errors:\r\n" + errors.ToString(e => "Line {0}: {1}".FormatWith(e.Line, e.ErrorText) + "\r\n" + lines[e.Line - 1], "\r\n\r\n")
                            };
                        }

                        if (DynamicCode.GetCustomErrors != null)
                        {
                            var allCustomErrors = DynamicCode.GetCustomErrors.GetInvocationListTyped().SelectMany(a => a(code) ?? new List <CompilerError>()).ToList();
                            if (allCustomErrors.Any())
                            {
                                var lines = code.Split('\n');
                                return new CompilationResult
                                {
                                    CompilationErrors = allCustomErrors.Count() + " Errors:\r\n" + allCustomErrors.ToString(e => "Line {0}: {1}".FormatWith(e.Line, e.ErrorText) + "\r\n" + lines[e.Line - 1], "\r\n\r\n")
                                };
                            }
                        }

                        Assembly assembly = compiled.CompiledAssembly;
                        Type type = assembly.GetTypes().Where(a => typeof(T).IsAssignableFrom(a)).SingleEx();

                        T algorithm = (T)assembly.CreateInstance(type.FullName);

                        return new CompilationResult {
                            Algorithm = algorithm
                        };
                    }
                    catch (Exception e)
                    {
                        return new CompilationResult {
                            CompilationErrors = e.Message
                        };
                    }
                }
            }));
        }
Exemplo n.º 7
0
        public async Task <PluginMetadata> LoadPlugin(string path, bool shouldAwait = true)
        {
            var pluginMetadata = new PluginMetadata
            {
                FileName = Path.GetFileName(path)
            };

            var options = new CompilerParameters();

            options.ReferencedAssemblies.Add(Assembly.GetEntryAssembly().Location);
            options.ReferencedAssemblies.Add("System.dll");
            options.ReferencedAssemblies.Add("System.Core.dll");
            options.ReferencedAssemblies.Add("System.Data.dll");
            options.ReferencedAssemblies.Add(ServerPath.GetBin("Newtonsoft.Json.dll"));
            options.GenerateInMemory = true;

            var c  = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();
            var cr = shouldAwait ? await Task.Run(() => c.CompileAssemblyFromSource(options, File.ReadAllText(path))) : c.CompileAssemblyFromSource(options, File.ReadAllText(path));

            if (cr.Errors.HasErrors)
            {
                var sb = new StringBuilder();
                foreach (CompilerError err in cr.Errors)
                {
                    sb.Append($"{err.ErrorText}\nLine: {err.Line} - Column: {err.Column}\n\n");
                }
                pluginMetadata.Error = sb.ToString();
                Console.WriteLine(pluginMetadata.Error);
                return(pluginMetadata);
            }

            try
            {
                pluginMetadata.Type = shouldAwait ? await Task.Run(() => cr.CompiledAssembly.GetType($"WindowsGSM.Plugins.{Path.GetFileNameWithoutExtension(path)}")) : cr.CompiledAssembly.GetType($"WindowsGSM.Plugins.{Path.GetFileNameWithoutExtension(path)}");

                var plugin = GetPluginClass(pluginMetadata);
                pluginMetadata.FullName = $"{plugin.FullName} [{pluginMetadata.FileName}]";
                pluginMetadata.Plugin   = plugin.Plugin;
                try
                {
                    string      gameImage = ServerPath.GetPlugins(pluginMetadata.FileName, $"{Path.GetFileNameWithoutExtension(pluginMetadata.FileName)}.png");
                    ImageSource image     = new BitmapImage(new Uri(gameImage));
                    pluginMetadata.GameImage = gameImage;
                }
                catch
                {
                    pluginMetadata.GameImage = DefaultPluginImage;
                }
                try
                {
                    string      authorImage = ServerPath.GetPlugins(pluginMetadata.FileName, "author.png");
                    ImageSource image       = new BitmapImage(new Uri(authorImage));
                    pluginMetadata.AuthorImage = authorImage;
                }
                catch
                {
                    pluginMetadata.AuthorImage = DefaultUserImage;
                }
                pluginMetadata.IsLoaded = true;
            }
            catch (Exception e)
            {
                pluginMetadata.Error = e.Message;
                Console.WriteLine(pluginMetadata.Error);
                pluginMetadata.IsLoaded = false;
            }

            return(pluginMetadata);
        }
Exemplo n.º 8
0
        public virtual void Compile(CompileOption compileOption, string path)
        {
            CompilerResults results;



            var parameters = new CompilerParameters();

            parameters.ReferencedAssemblies.AddRange(compileOption.LibraryRefrences);
            parameters.CompilerOptions = "/appconfig:\"" + (_fileSystemManager.RelativeToAbsolutePath("~/") + "web.config\"")
                                         .Replace("//", "/");
            parameters.GenerateInMemory      = false;
            parameters.GenerateExecutable    = compileOption.GenerateExecutable;
            parameters.TreatWarningsAsErrors = false;
            parameters.OutputAssembly        = path;
            //parameters.CoreAssemblyFileName = "System.dll";
            parameters.IncludeDebugInformation = compileOption.IncludeDebugInformation;

            parameters.TempFiles = HttpContext.Current.Request.IsLocal ?
                                   new TempFileCollection(Environment.GetEnvironmentVariable(Temp), true)
                : new TempFileCollection(Environment.GetEnvironmentVariable(Temp), false);


            if (compileOption.CodeProvider == SourceType.Csharp)
            {
                if (Convert.ToBoolean(WebConfigManager.GetSettingByOption(RoslynCompiler).Value))
                {
                    //roslyn compiler
                    var cSharpCodeProvider = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();

                    results = cSharpCodeProvider.CompileAssemblyFromSource(parameters, compileOption.Code);
                }
                else
                {
                    //old compiler
                    var cSharpCodeProvider = CodeDomProvider.CreateProvider(CSharp);

                    results = cSharpCodeProvider.CompileAssemblyFromSource(parameters, compileOption.Code);
                }
            }
            else
            {
                if (Convert.ToBoolean(WebConfigManager.GetSettingByOption(RoslynCompiler).Value))
                {
                    //roslyn compiler
                    var vBCodeProvider = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider();
                    results = vBCodeProvider.CompileAssemblyFromSource(parameters, compileOption.Code);
                }
                else
                {
                    //old compiler
                    var vBCodeProvider = CodeDomProvider.CreateProvider(VisualBasic);
                    results = vBCodeProvider.CompileAssemblyFromSource(parameters, compileOption.Code);
                }
            }

            if (results.Errors.HasErrors)
            {
                var warnings = new StringBuilder();
                var errors   = new StringBuilder();
                foreach (CompilerError error in results.Errors)
                {
                    if (error.IsWarning)
                    {
                        warnings.AppendLine($"Warning ({error.ErrorNumber}): {error.ErrorText}  , Line : {error.Line} , Column : {error.Column} . <br>");
                    }
                    else
                    {
                        errors.AppendLine($"Error ({error.ErrorNumber}): {error.ErrorText} , Line : {error.Line} , Column : {error.Column} . <br>");
                    }
                }

                throw new KhodkarInvalidException(errors.ToString() + warnings);
            }
        }
Exemplo n.º 9
0
        public static object CreaOggettoSerializzato(XDocument documentoCaricato, string nomeClasseAttuale, string classeSerializzataString, string nameSpaceScelto)
        {
            // Parametri Compilatore
            var compilerParams = new CompilerParameters
            {
                // Voglio la libreria dll, non l'exe
                GenerateExecutable = false
            };

            // Riferimenti
            compilerParams.ReferencedAssemblies.Add(@"System.dll");
            compilerParams.ReferencedAssemblies.Add(@"mscorlib.dll");
            compilerParams.ReferencedAssemblies.Add(@"sysglobl.dll");
            compilerParams.ReferencedAssemblies.Add(@"System.Net.dll");
            compilerParams.ReferencedAssemblies.Add(@"System.Core.dll");
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.dll");
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.Linq.dll");
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll");
            compilerParams.ReferencedAssemblies.Add(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.DataSetExtensions.dll");
            // N.B. Scommentare se servono le info per il debug
            // compilerParams.IncludeDebugInformation = true;

            // Compilatore
            CodeDomProvider cdp = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();

            /* Gestione salvataggio dll, per ora non serve
             * // Chiedo all'utilizzatore se vuole che venga creata la dll. Se è così gli chiedo di
             * // specificare il path dove vuole che venga creata
             * string dllPath;
             * Console.WriteLine("Specify the complete path of the new dll if you want to create it or just press Enter to skip: ");
             * dllPath = Console.ReadLine();
             *
             * // Se serve salvo la DLL, e poi chiedo di includerla
             * if (!String.IsNullOrWhiteSpace(dllPath))
             * {
             *  // Voglio Che salvi l'assembly, non che lo tenga in memoria
             *  compilerParams.GenerateInMemory = false;
             *
             *  // Dico dove salvare e quale nome debba avere la dll
             *  compilerParams.CompilerOptions = " -out:" + dllPath;
             *
             *  // Compila per salvare la dll, non ho trovato un modo migliore per salvarla
             *  var risultatoCompilazioneSalvataggio = cdp.CompileAssemblyFromSource(compilerParams, classeSerializzataString);
             *
             *  // Setta di nuovo le opzioni a null
             *  compilerParams.CompilerOptions = null;
             * }
             */

            // Arrivato qui Voglio che non venga salvato l'assembly ma solo creato un temporaneo
            compilerParams.GenerateInMemory = true;

            // Prova a compilare il file creato
            CompilerResults compilerResults = cdp.CompileAssemblyFromSource(compilerParams, classeSerializzataString);

            // Prende finalmente l'assembly
            Assembly assembly = compilerResults.CompiledAssembly;

            // Crea un istanza dell'oggetto, chiaramente aggiungo il NameSpace che so già
            var oggettoSerializzato = assembly.CreateInstance($"BELHXmlTool.{nameSpaceScelto}.{nomeClasseAttuale}");

            // Inizializza il serializer con il tipo dell'oggetto caricato
            var serializer = new XmlSerializer(oggettoSerializzato.GetType());

            // Carico il loadedDocument in un memoryStream che può essere deserializzato e ne resetto
            // la posizione per poterlo leggere
            var ms = new MemoryStream();

            documentoCaricato.Save(ms);
            ms.Position         = 0;
            oggettoSerializzato = serializer.Deserialize(ms);

            return(oggettoSerializzato);
        }