Esempio n. 1
1
        public static Assembly Compile(string sSource, string[] referencedAssemblies)
        {
            Microsoft.CSharp.CSharpCodeProvider comp = new Microsoft.CSharp.CSharpCodeProvider();
            CompilerParameters cp = new CompilerParameters();
            if (!PlatformDetector.IsUnix)
            {
                cp.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().CodeBase.Replace("file:///", ""));
            }
            else
            {
                cp.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().CodeBase.Replace("file://", ""));
            }
            cp.GenerateExecutable = false;
            cp.GenerateInMemory = true;
            foreach (var assembly in referencedAssemblies)
            {

                cp.ReferencedAssemblies.Add(Path.Combine(
                    AppDomain.CurrentDomain.BaseDirectory
                    , assembly + ".dll"));
            }
            CompilerResults cr = comp.CompileAssemblyFromSource(cp, sSource);
            if (cr.Errors.HasErrors)
            {
                StringBuilder sError = new StringBuilder();
                sError.Append("Error Compiling Expression: ");
                foreach (CompilerError err in cr.Errors)
                    sError.AppendFormat("{0}\n", err.ErrorText);
                throw new ApplicationException("Ошибка компиляции выражения: " + sError.ToString() + "\n" + sSource);
            }
            return cr.CompiledAssembly;
        }
        public static string GenTableAdapters(System.IO.Stream xmlStream, TypedDataSetGenerator.GenerateOption genOption, string customToolNamespace)
        {
            try
            {

                EnsureCustomDbProviders();
                var designSource = Activator.CreateInstance(assm.GetType("System.Data.Design.DesignDataSource"));
                designSource.Invoke("ReadXmlSchema",  xmlStream, string.Empty );
                var dataSourceGeneratorType = assm.GetType("System.Data.Design.TypedDataSourceCodeGenerator");
                //get the specific constructor
                var constructor = dataSourceGeneratorType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic,
                    null, CallingConventions.Any, new Type[0], new ParameterModifier[0]);
                var dataSourceGenerator = constructor.Invoke(null);

                var codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                dataSourceGenerator.SetInternalPropertyValue("CodeProvider", codeProvider);

                var codeCompileUnit = new CodeCompileUnit();
                var codeNamespace = new CodeNamespace(customToolNamespace);
                codeCompileUnit.Namespaces.Add(codeNamespace);

                dataSourceGenerator.InvokeInternal("GenerateDataSource",  designSource, codeCompileUnit, codeNamespace, customToolNamespace, genOption );
                var writer = new StringWriter();
                var adapterNameSpace = codeCompileUnit.Namespaces[1];
                codeProvider.GenerateCodeFromNamespace(adapterNameSpace, writer, new CodeGeneratorOptions());
                //codeProvider.GenerateCodeFromCompileUnit(codeCompileUnit, writer, options);
                var res = writer.ToString();
                return (string)res;
            }
            catch (Exception e)
            {

                return e.ToString();
            }
        }
Esempio n. 3
0
		public bool execScript(string dirPath)
		{
			Microsoft.CSharp.CSharpCodeProvider csharp = new Microsoft.CSharp.CSharpCodeProvider();
			// Setup default params for compiler
			CompilerParameters compilerParams = new CompilerParameters();
			compilerParams.GenerateExecutable = false;
			compilerParams.GenerateInMemory = true;
			compilerParams.IncludeDebugInformation = false;
			compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
			compilerParams.ReferencedAssemblies.Add("System.dll");
			compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
			compilerParams.ReferencedAssemblies.Add("NoxShared.dll");
			
			// Compile C# script
			CompilerResults results = csharp.CompileAssemblyFromFile(compilerParams, Directory.GetFiles(dirPath, "*.cs"));

			// Error handling
			if (results.Errors.Count > 0)
			{
				foreach (CompilerError e in results.Errors)
					System.Diagnostics.Debug.WriteLine(String.Format("{0} {1}: {2}", e.FileName, e.Line, e.ErrorText));
				return false;
			}

			// Save assembly in class variable
			scriptAssembly = results.CompiledAssembly;

			// Create Script Instance
			if (initScript())
			{
				// Run Script
				return runScript();
			}
			return false;
		}
 public void GenerateCode(CodeDomGenerator.Language language)
 {
     switch (language)
     {
         case CodeDomGenerator.Language.CSharp:
             if (_csStatement != null)
                 using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
                 {
                     System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                     using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                     {
                         provider.GenerateCodeFromStatement(_csStatement, tw, opts);
                         Value = tw.InnerWriter.ToString();
                     }
                 }
             break;
         case CodeDomGenerator.Language.VB:
             if (_vbStatement != null)
                 using (Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider())
                 {
                     System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                     using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                     {
                         provider.GenerateCodeFromStatement(_vbStatement, tw, opts);
                         Value = tw.InnerWriter.ToString();
                     }
                 }
             break;
         default:
             throw new NotImplementedException(language.ToString());
     }
 }
Esempio n. 5
0
        // public ���\�b�h
        public void CompileFile(string filePath)
        {
            if(!File.Exists(filePath)){
                throw new Exception("�t�@�C��������܂��� : " + filePath);
            }

            CodeDomProvider myCompiler;
            string ext = Path.GetExtension(filePath).ToLower();
            switch(ext){
            case JsExt:
                myCompiler = new Microsoft.JScript.JScriptCodeProvider();
                break;
            case CsExt:
                myCompiler = new Microsoft.CSharp.CSharpCodeProvider();
                break;
            case VbExt:
                myCompiler = new Microsoft.VisualBasic.VBCodeProvider();
                break;
            default:
                throw new Exception("���Ή��̃t�@�C���g���q�ł�: " + filePath);
            }

            myPluginDllPath = mySetting.TemplateDir + Path.GetFileNameWithoutExtension(filePath) + ".dll";
            string code = Util.LoadFile(filePath);

            CompilerParameters cp = new CompilerParameters();
            cp.GenerateExecutable = true;
            cp.OutputAssembly = myPluginDllPath;
            CompilerResults cr = myCompiler.CompileAssemblyFromSource(cp, code);
            foreach(string s in cr.Output){
                Console.WriteLine(s);
            }

            myCompiler.Dispose();
        }
 public void GenerateCode(CodeDomGenerator.Language language)
 {
     switch (language)
     {
         case CodeDomGenerator.Language.CSharp:
             using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
             {
                 System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                 using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                 {
                     tw.Write("continue;");
                     Value = tw.InnerWriter.ToString();
                 }
             }
             break;
         case CodeDomGenerator.Language.VB:
             using (Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider())
             {
                 System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                 using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                 {
                     tw.Write("Continue For");
                     Value = tw.InnerWriter.ToString();
                 }
             }
             break;
         default:
             throw new NotImplementedException(language.ToString());
     }
 }
Esempio n. 7
0
 public void GenerateCode(CodeDomGenerator.Language language)
 {
     switch (language)
     {
         case CodeDomGenerator.Language.CSharp:
             using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
             {
                 System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                 using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                 {
                     tw.Write("var {0} = ", provider.CreateEscapedIdentifier(VariableName));
                     provider.GenerateCodeFromExpression(InitExpression, tw, opts);
                     tw.Write(";");
                     Value = tw.InnerWriter.ToString();
                 }
             }
             break;
         case CodeDomGenerator.Language.VB:
             using (Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider())
             {
                 System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                 using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                 {
                     tw.Write("Dim {0} = ", provider.CreateEscapedIdentifier(VariableName));
                     provider.GenerateCodeFromExpression(InitExpression, tw, opts);
                     Value = tw.InnerWriter.ToString();
                 }
             }
             break;
         default:
             throw new NotImplementedException(language.ToString());
     }
 }
        public static Assembly Compile(string sourcecode, string[] references, CompileLanguage language = CompileLanguage.CSharp)
        {
            CodeDomProvider comp = null;
            switch (language)
            {
                case CompileLanguage.VisualBasic:
                    comp = new Microsoft.VisualBasic.VBCodeProvider();
                    break;
                case CompileLanguage.CSharp:
                default:
                    comp = new Microsoft.CSharp.CSharpCodeProvider();
                    break;
            }
            CompilerParameters cp = new CompilerParameters();
            foreach (string reference in references)
            {
                cp.ReferencedAssemblies.Add(reference);
            }
            cp.GenerateInMemory = true;

            CompilerResults cr = comp.CompileAssemblyFromSource(cp, sourcecode);
            if (cr.Errors.HasErrors)
            {
                string error = string.Empty;
                foreach (CompilerError err in cr.Errors)
                {
                    error += err.ErrorText + System.Environment.NewLine;
                }
                System.Diagnostics.Trace.WriteLine(error);
                return null;
            }

            return cr.CompiledAssembly;
        }
Esempio n. 9
0
        public override object Execute(string code)
        {
            ICodeCompiler compiler = new Microsoft.CSharp.CSharpCodeProvider().CreateCompiler();
            CompilerParameters cmpParams = new System.CodeDom.Compiler.CompilerParameters();
            cmpParams.GenerateInMemory = true;
            cmpParams.GenerateExecutable = true;
            //cmpParams.CompilerOptions = "/t:exe";

            foreach (string ass in this._referencedAssemblies)
                cmpParams.ReferencedAssemblies.Add(ass+".dll");

            string codeString = this.GenerateReferenceString();
            codeString = this.InsertCode(code);

            CompilerResults results = compiler.CompileAssemblyFromSource(cmpParams, codeString);

            //			foreach (System.CodeDom.Compiler.CompilerError ce in results.Errors)
            //				this.Put(ce.ErrorText);

            if (results.Errors.Count == 0 && results.CompiledAssembly!=null)
            {
                System.Reflection.MethodInfo methodInfo = results.CompiledAssembly.EntryPoint;
                return methodInfo.Invoke(null, null);
            }
            return null;
        }
        //-----------------------------------------------------------------------------
        // Internal Methods
        //-----------------------------------------------------------------------------
        // Compile the final code for a script only to find any errors and/or warnings.
        private static ScriptCompileResult CompileScript(string code)
        {
            // Setup the compile options.
            CompilerParameters options	= new CompilerParameters();
            options.GenerateExecutable	= false; // We want a Dll (Class Library)
            options.GenerateInMemory	= true;

            // Add the assembly references.
            Assembly zeldaApiAssembly = Assembly.GetAssembly(typeof(ZeldaAPI.CustomScriptBase));
            options.ReferencedAssemblies.Add(zeldaApiAssembly.Location);

            // Create a C# code provider and compile the code.
            Microsoft.CSharp.CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider();
            CompilerResults csResult = csProvider.CompileAssemblyFromSource(options, code);

            // Copy warnings and errors into the ScriptComileResult.
            ScriptCompileResult result	= new ScriptCompileResult();
            foreach (CompilerError csError in csResult.Errors) {
                ScriptCompileError error = new ScriptCompileError(csError.Line,
                    csError.Column, csError.ErrorNumber, csError.ErrorText, csError.IsWarning);
                if (error.IsWarning)
                    result.Warnings.Add(error);
                else
                    result.Errors.Add(error);
            }

            return result;
        }
Esempio n. 11
0
        public static void createAssembly(string code)
        {
            string[] sources = { code };
            CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateInMemory = true;
            parameters.GenerateExecutable = (bool)launchArguments.flags["createbinary"];
            if ((bool)launchArguments.flags["createbinary"])
                parameters.OutputAssembly = IO.getExePath();

            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            parameters.ReferencedAssemblies.Add("System.Drawing.dll");

            using (Microsoft.CSharp.CSharpCodeProvider CodeProv =
            new Microsoft.CSharp.CSharpCodeProvider())
            {
                CompilerResults results = CodeProv.CompileAssemblyFromSource(parameters, sources);

                if (results.Errors.HasErrors)
                    debug.throwException("Compilation error", String.Join(Environment.NewLine, results.Errors.Cast<CompilerError>().Select(n => n.ToString())), debug.importance.Fatal);

                if (!(bool)launchArguments.flags["createbinary"])
                {
                    Console.WriteLine("Initializing ListSharp");

                    var type = results.CompiledAssembly.GetType("MainClass");
                    var obj = Activator.CreateInstance(type);
                    var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
                    Console.WriteLine(output);
                }
            }
        }
Esempio n. 12
0
        public static string ParseString(string input)
        {
            var provider = new Microsoft.CSharp.CSharpCodeProvider();
            var parameters = new System.CodeDom.Compiler.CompilerParameters()
            {
                GenerateExecutable = false,
                GenerateInMemory = true,
            };

            var code = @"
            namespace Tmp
            {
                public class TmpClass
                {
                    public static string GetValue()
                    {
                        return """ + input + @""";
                    }
                }
            }";

            var compileResult = provider.CompileAssemblyFromSource(parameters, code);

            if (compileResult.Errors.HasErrors)
            {
                return input;
                //throw new ArgumentException(compileResult.Errors.Cast<System.CodeDom.Compiler.CompilerError>().First(e => !e.IsWarning).ErrorText);
            }

            var asmb = compileResult.CompiledAssembly;
            var method = asmb.GetType("Tmp.TmpClass").GetMethod("GetValue");

            return method.Invoke(null, null) as string;
        }
 private static CodeDomProvider GetCodeDomProvider(string fileExtension)
 {
     CodeDomProvider cdp;
     switch (fileExtension)
     {
         case ".fsx":
             cdp = CodeDomProvider.CreateProvider("f#");
             break;
         case ".csx":
             cdp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v3.5" } });
             break;
         case ".vbx":
             cdp = new Microsoft.VisualBasic.VBCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v3.5" } });
             break;
         case ".jsx":
             // Have to figure out better JS support
             cdp = CodeDomProvider.CreateProvider("js");
             break;
         default:
             if (CodeDomProvider.IsDefinedExtension(fileExtension))
             {
                 cdp = CodeDomProvider.CreateProvider(CodeDomProvider.GetLanguageFromExtension(fileExtension));
             }
             else
             {
                 throw new ScriptDoesNotCompileException("Unknown extension.");
             }
             break;
     }
     return cdp;
 }
Esempio n. 14
0
        private void GenerateCS()
        {
            using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
            {
                CodeGeneratorOptions opts = new CodeGeneratorOptions();
                StringWriter sw = new StringWriter();
                provider.GenerateCodeFromMember(_method, sw, opts);
                StringReader sr = new StringReader(sw.GetStringBuilder().ToString());
                string line = sr.ReadLine();
                while (string.IsNullOrEmpty(line))
                    line = sr.ReadLine();
                int idx = line.IndexOf(" " + _method.Name + "(");
                idx = line.LastIndexOf(' ', idx - 1);

                if (_method.Statements.Count > 0)
                {
                    Text = "partial" + line.Remove(0, idx);
                    Text = sw.GetStringBuilder().Replace(line, Text).ToString();
                }
                else
                {
                    line = "partial" + line.Remove(0, idx);
                    idx = line.LastIndexOf(')');
                    Text = line.Remove(idx + 1) + ";" + Environment.NewLine;
                }
            }
        }
Esempio n. 15
0
        /// <summary>
        /// 动态编译
        /// </summary>
        /// <param name="formula">需编译的内容</param>
        /// <param name="returnType">返回类型</param>
        /// <param name="obj">参数</param>
        /// <returns></returns>
        public static object Calculate(string formula, string returnType, object obj)
        {
            try
            {
                string paramExp = obj.GetType().ToString() + " obj";
                object calculated = null;

                Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
                System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();
                parameter.ReferencedAssemblies.Add("System.dll");
                parameter.GenerateExecutable = false; //<--不要生成 EXE 文件
                parameter.GenerateInMemory = true; //在内存中运行
                string codeDom = GenerateCodeBlocks(formula, returnType, paramExp);
                System.CodeDom.Compiler.CompilerResults result = provider.CompileAssemblyFromSource(parameter,codeDom);//动态编译后的结果

                if (result.Errors.Count > 0)
                {
                    return null;
                }
                System.Reflection.MethodInfo newMethod = result.CompiledAssembly.GetType("Maike.Calculation").GetMethod("dowork");
                calculated = result.CompiledAssembly.GetType("Maike.Calculation").GetMethod("dowork").Invoke(null, new object[] { obj });

                return calculated;
            }
            catch
            {
                return null;
            }
        }
Esempio n. 16
0
        static void Main(params string[] args)
        {
            var path = @"..\..\..\Mubble.Data\Raw\Database.dbml";
            var dataTypeAssemblyPath = @"..\..\..\Mubble.Data\bin\Debug\Mubble.Data.dll";
            var dataTypePath = @"..\..\..\Mubble.Data\Generated\DataTypes.xml";
            var output = @"..\..\..\Mubble.Data\Generated\RecordTypes.cs";
            var dataTypeOutput = @"..\..\..\Mubble.Data\Generated\DataTypes.cs";

            LoadDataTypeAssembly(dataTypeAssemblyPath, dataTypePath);

            var cs = new Microsoft.CSharp.CSharpCodeProvider();

            var types = DataObjectHelper.Convert(dataTypePath);

            var c = Generate(types.ToCompileUnit(), cs);

            File.WriteAllText(dataTypeOutput, c);

            var database = DbmlHelper.Convert(path);

            var code = Generate(database.ToCompileUnit(), cs);

            File.WriteAllText(output, code);

            //Console.ReadLine();
        }
Esempio n. 17
0
        /// <summary>
        /// Writes the code to string in the specific language
        /// and returns the string
        /// </summary>
        public static string Create(Language language, string expression, RegexOptions options)
        {
            CodeCompileUnit unit = Create(expression, options);

            System.Text.StringBuilder builder = new System.Text.StringBuilder();

            using (System.IO.StringWriter stringWriter = new System.IO.StringWriter(builder))
            {
                System.CodeDom.Compiler.ICodeGenerator generator;

                switch (language)
                {
                    case Language.CSharp:
                        System.CodeDom.Compiler.CodeGeneratorOptions genOptions = new System.CodeDom.Compiler.CodeGeneratorOptions();
                        genOptions.BracingStyle = "C";
                        generator = new Microsoft.CSharp.CSharpCodeProvider().CreateGenerator();
                        generator.GenerateCodeFromCompileUnit(unit, stringWriter, genOptions);
                        break;
                    case Language.VisualBasic:
                        generator = new Microsoft.VisualBasic.VBCodeProvider().CreateGenerator();
                        generator.GenerateCodeFromCompileUnit(unit, stringWriter, null);
                        break;
                }

                return builder.ToString();
            }
        }
        public static void service_info_methods()
        {
            uri = new Uri("http://localhost:60377/Service1.asmx?wsdl"); 
            WebRequest webRequest = WebRequest.Create(uri);
            System.IO.Stream requestStream = webRequest.GetResponse().GetResponseStream();
            // Get a WSDL file describing a service
            ServiceDescription sd = ServiceDescription.Read(requestStream);
            string sdName = sd.Services[0].Name;

            // Initialize a service description servImport
            ServiceDescriptionImporter servImport = new ServiceDescriptionImporter();
            servImport.AddServiceDescription(sd, String.Empty, String.Empty);
            servImport.ProtocolName = "Soap";
            servImport.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;

            CodeNamespace nameSpace = new CodeNamespace();
            CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
            codeCompileUnit.Namespaces.Add(nameSpace);
            // Set Warnings
            ServiceDescriptionImportWarnings warnings = servImport.Import(nameSpace, codeCompileUnit);

            if (warnings == 0)
            {
                StringWriter stringWriter = new StringWriter(System.Globalization.CultureInfo.CurrentCulture);
                Microsoft.CSharp.CSharpCodeProvider prov = new Microsoft.CSharp.CSharpCodeProvider();
                prov.GenerateCodeFromNamespace(nameSpace, stringWriter, new CodeGeneratorOptions());

                string[] assemblyReferences = new string[2] { "System.Web.Services.dll", "System.Xml.dll" };
                CompilerParameters param = new CompilerParameters(assemblyReferences);
                param.GenerateExecutable = false;
                param.GenerateInMemory = true;
                param.TreatWarningsAsErrors = false;
                param.WarningLevel = 4;

                CompilerResults results = new CompilerResults(new TempFileCollection());
                results = prov.CompileAssemblyFromDom(param, codeCompileUnit);
                Assembly assembly = results.CompiledAssembly;
                service = assembly.GetType(sdName);

                methodInfo = service.GetMethods();

                int c = 0;
                foreach (MethodInfo t in methodInfo)
                {
                    if (t.Name == "Discover")
                        break;
                    c++;
                }
                listurl = new string[c]; c = 0;
                foreach (MethodInfo t in methodInfo)
                {
                    if (t.Name == "Discover")
                        break;
                    listurl[c++] = t.Name;
                }

            }

        }
 public CSharpRoslynCompilerService(bool strictMode = true, Func<ParserBase> markupParserFactory = null)
     : base(new RazorEngine.Compilation.CSharp.CSharpRazorCodeLanguage(strictMode),
         markupParserFactory)
 {
     #if !RAZOR4
     _codeDomProvider = new Microsoft.CSharp.CSharpCodeProvider();
     #endif
 }
Esempio n. 20
0
		public static string Friendly(Type type)
		{
			using (var provider = new Microsoft.CSharp.CSharpCodeProvider())
			{
				var @ref = new CodeTypeReference(type);
				return provider.GetTypeOutput(@ref);
			}
		}
 public EmbeddedScripting()
 {
     CodeProvider = new Microsoft.CSharp.CSharpCodeProvider();
     Parameters = new CompilerParameters();
     Parameters.GenerateExecutable = false;
     Parameters.GenerateInMemory = true;
     Parameters.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);
 }
Esempio n. 22
0
        static void CompileScripts( Dictionary<string, Script> scripts, Dictionary<string, CommandDelegate> commands, ClassicBot main )
        {
            foreach( var keypair in scripts ) {
                Script script = keypair.Value;
                if( String.IsNullOrEmpty( script.Code ) ) continue;
                CodeDomProvider compiler;
                if( script.IsCSharp ) {
                    compiler = new Microsoft.CSharp.CSharpCodeProvider( new Dictionary<string, string>{ { "CompilerVersion", "v2.0" } } );
                } else {
                    compiler = new Microsoft.VisualBasic.VBCodeProvider( new Dictionary<string, string>{ { "CompilerVersion", "v2.0" } } );
                }

                CompilerParameters cParams = new CompilerParameters {
                    GenerateExecutable = false,
                    GenerateInMemory = true,
                    //CompilerOptions = "/unsafe", Causes errors with the Visual Basic Compiler.
                    TreatWarningsAsErrors = false,
                    WarningLevel = 4,
                };
                if( script.KnownReferences == null || script.KnownReferences.Length == 0 ) { // Add defalt references.
                    cParams.ReferencedAssemblies.Add( "System.dll" );
                    cParams.ReferencedAssemblies.Add( "LibClassicBot.dll" );
                } else {
                    cParams.ReferencedAssemblies.AddRange( script.KnownReferences );
                }

                CompilerResults results = compiler.CompileAssemblyFromSource( cParams, script.Code );
                if( results.Errors.Count != 0 )  {
                    try {
                        foreach( CompilerError error in results.Errors ) {
                            string errorMsg = String.Format( "{0} Line: {1} {2}", error.ErrorNumber, error.Line, error.ErrorText );
                            if( error.IsWarning ) {
                                main.Log( LogType.Error, "Warning while compiling script " + keypair.Key, errorMsg );
                            } else {
                                main.Log( LogType.Error, "Error while compiling script " + keypair.Key, errorMsg );
                            }
                        }
                    } catch( Exception e ) {
                        main.Log( LogType.Error, "Error while trying to display errors. " , e.ToString() );
                    }
                    continue;
                }
                compiler.Dispose();

                Type[] types = results.CompiledAssembly.GetTypes();
                for( int i = 0; i < types.Length; i++ ) {
                    Type type = types[i];
                    if( type.IsSubclassOf( typeof( Plugin ) ) ) {
                        Plugin plugin = (Plugin)Activator.CreateInstance( type );
                        plugin.Initialize( main );
                        if( !commands.ContainsKey( plugin.CommandName ) ) {
                            main.Log( LogType.BotActivity, "Loaded command " + plugin.CommandName );
                            commands.Add( plugin.CommandName, plugin.Command );
                        }
                    }
                }
            }
        }
        private void GenerateCS()
        {
            using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
            {
                CodeGeneratorOptions opts = new CodeGeneratorOptions();
                StringWriter sw = new StringWriter();
                List<CodeTypeReference> implTypes = new List<CodeTypeReference>();
                if (_property.ImplementationTypes != null)
                {
                    var arr = new CodeTypeReference[_property.ImplementationTypes.Count];
                    _property.ImplementationTypes.CopyTo(arr, 0);
                    _property.ImplementationTypes.Clear();
                    _property.PrivateImplementationType = null;
                    implTypes.AddRange(arr);
                }
                provider.GenerateCodeFromMember(_property, sw, opts);
                foreach (CodeTypeReference tr in implTypes)
                {
                    _property.ImplementationTypes.Add(tr);
                }
                //StringReader sr = new StringReader(sw.GetStringBuilder().ToString());
                //string line = sr.ReadLine();
                //while (string.IsNullOrEmpty(line) || line.StartsWith("/") || line.StartsWith("["))
                //    line = sr.ReadLine();

                StringBuilder sb = new StringBuilder();

                if (InterfaceProperties != null)
                {
                    foreach (CodeTypeReference tr in implTypes)
                    {
                        string prop;
                        if (InterfaceProperties.TryGetValue(tr, out prop))
                        {
                            var newProp = Define.Property(_property.Type, MemberAttributes.Private, prop).Implements(tr);
                            if (_property.HasGet)
                            {
                                newProp.GetStatements.Add(Emit.@return(()=>[email protected](_property.Name)));
                                newProp.HasGet = true;
                            }
                            if (_property.HasSet)
                            {
                                newProp.SetStatements.Add(Emit.assignProperty(_property.Name, () => CodeDom.VarRef("value")));
                                newProp.HasSet = true;
                            }

                            StringWriter swNew = new StringWriter();
                            provider.GenerateCodeFromMember(CodeDomTreeProcessor.ProcessMember(newProp, CodeDomGenerator.Language.CSharp),
                                swNew, opts);
                            sb.Append(swNew.ToString());
                        }
                    }
                    if (sb.Length > 0)
                        sb.Insert(0, Environment.NewLine);
                }
                Text = sw.GetStringBuilder().ToString() + sb.ToString();
            }
        }
Esempio n. 24
0
        static void Main(string[] args)
        {
            CodeDomProvider codeDomProvider = new Microsoft.CSharp.CSharpCodeProvider();

            string[] assemblyNames = new string[]{
                "mscorlib.dll",
                "System.dll",
                "System.Data.dll",
                "System.Drawing.dll",
                "System.Xml.dll",
                "System.Core.dll",
                "System.Windows.Forms.dll"
            };

            CompilerParameters compilerParameters = new CompilerParameters(assemblyNames){
                OutputAssembly = "OutputAssembly.dll",
                GenerateExecutable = false,
                GenerateInMemory = true,
                WarningLevel = 3,
                CompilerOptions = "/optimize",
                IncludeDebugInformation = false,
                //TempFiles = new TempFileCollection(".", true)
            };

            CompilerResults compilerResults = codeDomProvider.CompileAssemblyFromSource(
                compilerParameters,
                new string[] { Code });

            /* This prints low-level messages like this, as well as error messages:
                *
                * G:\tmp\CsCompilerTest\WorkingDir> "C:\Windows\Microsoft.NET\Framework\v4.0.30319
                * \csc.exe" /t:library /utf8output /out:"C:\Users\Adam Sawicki\AppData\Local\Temp\
                * 0pdzupen.dll" /debug- /optimize+ /w:3 /optimize  "C:\Users\Adam Sawicki\AppData\
                * Local\Temp\0pdzupen.0.cs"

                * Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
                * Copyright (C) Microsoft Corporation. All rights reserved.
                */
            foreach (String message in compilerResults.Output)
                Console.WriteLine(message);

            /* This prints error messages in form of:
                *
                * c:\Users\Adam Sawicki\AppData\Local\Temp\4kbqoyz2.0.cs(7,9) : error CS0103: The
                * name 'Console' does not exist in the current context
                */
            //foreach (CompilerError error in compilerResults.Errors)
            //    Console.WriteLine(error.ToString());

            Assembly assembly = compilerResults.CompiledAssembly;
            if (assembly == null) return;

            object obj = assembly.CreateInstance("MainClass");
            if (obj == null) return;

            Type type = obj.GetType();
            type.InvokeMember("Main", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, obj, new object[] { });
        }
Esempio n. 25
0
        /// <summary>
        /// Generates an Assembly from a script filename
        /// </summary>
        /// <param name="filename">The filename of the script</param>
        /// <param name="references">Assembly references for the script</param>
        /// <returns>The generated assembly</returns>
        public Assembly CreateAssembly(string filename, IList references)
        {
            // ensure that compilerErrors is null
            compilerErrors = null;

            string extension = Path.GetExtension(filename);

            // Select the correct CodeDomProvider based on script file extension
            CodeDomProvider codeProvider = null;
            switch (extension)
            {
                case ".cs":
                    codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                    break;
                case ".vb":
                    codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                    break;
                default:
                    throw new InvalidOperationException("Script files must have a .cs or .vb.");
            }



            // Set compiler parameters
            CompilerParameters compilerParams = new CompilerParameters();
            compilerParams.CompilerOptions = "/target:library /optimize";
            compilerParams.GenerateExecutable = false;
            compilerParams.GenerateInMemory = true;
            compilerParams.IncludeDebugInformation = false;

            compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
            compilerParams.ReferencedAssemblies.Add("System.dll");

            // Add custom references
            foreach (string reference in references)
            {
                if (!compilerParams.ReferencedAssemblies.Contains(reference))
                {
                    compilerParams.ReferencedAssemblies.Add(reference);
                }
            }

            // Do the compilation
            CompilerResults results = codeProvider.CompileAssemblyFromFile(compilerParams,
                filename);

            //Do we have any compiler errors
            if (results.Errors.Count > 0)
            {
                compilerErrors = results.Errors;
                throw new Exception(
                    "Compiler error(s) encountered and saved to AssemblyFactory.CompilerErrors");
            }

            Assembly createdAssembly = results.CompiledAssembly;
            return createdAssembly;
        }
Esempio n. 26
0
        public void GenerateCode(CodeDomGenerator.Language language)
        {
            switch (language)
            {
                case CodeDomGenerator.Language.CSharp:
                    using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
                    {
                        System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                        using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                        {

                            tw.Write("foreach (");
                            provider.GenerateCodeFromExpression(new CodeTypeReferenceExpression(IterationItemType), tw, opts);
                            tw.Write(" {0} in ", provider.CreateValidIdentifier(IterationItemName));
                            provider.GenerateCodeFromExpression(IterExpression, tw, opts);
                            tw.WriteLine(")");
                            tw.WriteLine("{");
                            tw.Indent++;
                            if (Statements != null)
                                foreach (CodeStatement statement in Statements)
                                {
                                    provider.GenerateCodeFromStatement(statement, tw, opts);
                                }
                            tw.Indent--;
                            tw.WriteLine("}");
                            Value = tw.InnerWriter.ToString();
                        }
                    }
                    break;
                case CodeDomGenerator.Language.VB:
                    using (Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider())
                    {
                        System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                        using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                        {
                            tw.Write("For Each {0} As ", provider.CreateValidIdentifier(IterationItemName));
                            provider.GenerateCodeFromExpression(new CodeTypeReferenceExpression(IterationItemType), tw, opts);
                            tw.Write(" in ");
                            provider.GenerateCodeFromExpression(IterExpression, tw, opts);
                            tw.WriteLine();
                            tw.Indent++;
                            if (Statements != null)
                                foreach (CodeStatement statement in Statements)
                                {
                                    provider.GenerateCodeFromStatement(statement, tw, opts);
                                }
                            tw.Indent--;
                            tw.WriteLine("Next");
                            Value = tw.InnerWriter.ToString();
                        }
                    }
                    break;
                default:
                    throw new NotImplementedException(language.ToString());
            }
        }
Esempio n. 27
0
        public void GenerateCode(CodeDomGenerator.Language language)
        {
            switch (language)
            {
                case CodeDomGenerator.Language.CSharp:
                    using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
                    {
                        System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                        using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                        {

                            tw.WriteLine("do");
                            tw.WriteLine("{");
                            tw.Indent++;
                            if (Statements != null)
                                foreach (CodeStatement statement in Statements)
                                {
                                    provider.GenerateCodeFromStatement(statement, tw, opts);
                                }
                            tw.Indent--;
                            tw.Write("} while (");
                            if (TestExpression != null)
                                provider.GenerateCodeFromExpression(TestExpression, tw, opts);
                            tw.WriteLine(");");

                            Value = tw.InnerWriter.ToString();
                        }
                    }
                    break;
                case CodeDomGenerator.Language.VB:
                    using (Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider())
                    {
                        System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                        using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                        {
                            tw.WriteLine("Do");
                            tw.Indent++;
                            if (Statements != null)
                                foreach (CodeStatement statement in Statements)
                                {
                                    provider.GenerateCodeFromStatement(statement, tw, opts);
                                }
                            tw.Indent--;
                            tw.Write("Loop Until ");
                            if (TestExpression != null)
                                provider.GenerateCodeFromExpression(TestExpression, tw, opts);
                            tw.WriteLine();

                            Value = tw.InnerWriter.ToString();
                        }
                    }
                    break;
                default:
                    throw new NotImplementedException(language.ToString());
            }
        }
Esempio n. 28
0
        /// <summary>
        /// Gets the primitive value literal.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <returns>System.String.</returns>
        public static string GetPrimitiveValueLiteral(object value)
        {
            using (var writer = new StringWriter(CultureInfo.InvariantCulture))
            using (var provider = new Microsoft.CSharp.CSharpCodeProvider())
            {
                provider.GenerateCodeFromExpression(new CodePrimitiveExpression(value), writer, null);

                return writer.ToString();
            }
        }
Esempio n. 29
0
        public Assembly CreateAssembly(string filename, IList references)
        {
            
            compilerErrors = null;

            string extension = Path.GetExtension(filename);
            CodeDomProvider codeProvider = null;
            switch (extension)
            {
                case ".cs":
                    codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                    break;
                case ".vb":
                    codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                    break;
                default:
                    throw new InvalidOperationException("Script files must have a .cs or .vb.");
            }

            CompilerParameters compilerParams = new CompilerParameters();
            compilerParams.CompilerOptions = "/target:library /optimize";
            compilerParams.GenerateExecutable = false;
            compilerParams.GenerateInMemory = true;
            compilerParams.IncludeDebugInformation = false;

            compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
            compilerParams.ReferencedAssemblies.Add("System.dll");

          
            foreach (string reference in references)
            {
                if (!compilerParams.ReferencedAssemblies.Contains(reference))
                {
                    compilerParams.ReferencedAssemblies.Add(reference);
                }
            }

            CompilerResults results = codeProvider.CompileAssemblyFromFile(compilerParams,
                filename);

            if (results.Errors.Count > 0)
            {
                StringBuilder sb = new StringBuilder();
                foreach (CompilerError item in results.Errors)
                {
                    sb.AppendFormat("{0} line:{1}   {2}\r\n", item.FileName, item.Line, item.ErrorText);
                }
                compilerErrors = results.Errors;
                throw new Exception(
                    "Compiler error(s)\r\n" + sb.ToString());
            }

            Assembly createdAssembly = results.CompiledAssembly;
            return createdAssembly;
        }
        public ASLMethod(String code)
        {
            using (var provider =
                new Microsoft.CSharp.CSharpCodeProvider())
            {
                var builder = new StringBuilder();
                builder
                    .AppendLine("using System;")
                    .AppendLine("using System.Collections.Generic;")
                    .AppendLine("using System.Linq;")
                    .AppendLine("using System.Reflection;")
                    .AppendLine("using System.Text;")
                    .AppendLine("public class CompiledScript")
                    .AppendLine("{")
                        .AppendLine("public dynamic Execute(dynamic timer, dynamic old, dynamic current)")
                        .AppendLine("{")
                            .Append(code)
                            .Append("return null;")
                        .AppendLine("}")
                    .AppendLine("}");

                var parameters = new System.CodeDom.Compiler.CompilerParameters()
                    {
                        GenerateInMemory = true,
                        CompilerOptions = "/optimize",
                    };
                parameters.ReferencedAssemblies.Add("System.dll");
                parameters.ReferencedAssemblies.Add("System.Core.dll");
                parameters.ReferencedAssemblies.Add("System.Data.dll");
                parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
                parameters.ReferencedAssemblies.Add("System.Drawing.dll");
                parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
                parameters.ReferencedAssemblies.Add("System.Xml.dll");
                parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
                parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");

                var res = provider.CompileAssemblyFromSource(parameters, builder.ToString());

                if (res.Errors.HasErrors)
                {
                    var errorMessage = "";
                    foreach (var error in res.Errors)
                    {
                        errorMessage += error + "\r\n";
                    }
                    throw new ArgumentException(errorMessage, "code");
                }

                var type = res.CompiledAssembly.GetType("CompiledScript");
                CompiledCode = Activator.CreateInstance(type);
            }
        }
Esempio n. 31
0
        private CodeDomProvider GetProviderAndSetExtension(string codeLanguage, ref string outputFile)
        {
            String codeLang;

            if (!_codeLangMapping.TryGetValue(codeLanguage, out codeLang))
            {
                throw new NotSupportedException("The specified code language is not supported: '" +
                                                CodeLanguage +
                                                "'");
            }

            CodeDomProvider provider;

            switch (codeLang)
            {
            case CSharp:
                provider   = new Microsoft.CSharp.CSharpCodeProvider();
                outputFile = Path.ChangeExtension(outputFile, ".cs");
                break;

            case VisualBasic:
                provider   = new Microsoft.VisualBasic.VBCodeProvider();
                outputFile = Path.ChangeExtension(outputFile, ".vb");
                break;

            case FSharp_cl:
                provider   = new FSharp.Compiler.CodeDom.FSharpCodeProvider();
                outputFile = Path.ChangeExtension(outputFile, ".fs");
                break;

            case CPP:
                // We load the CppCodeProvider via reflection since a hard reference would
                // require client machines to have the provider installed just to run the task.
                // This way relieves us of the dependency.
                try
                {
                    Assembly cppCodeProvider = Assembly.Load(CppCodeProviderAssembly);
                    provider = cppCodeProvider.CreateInstance(CppCodeProviderType)
                               as CodeDomProvider;
                }
                catch (FileLoadException fileLoadEx)
                {
                    String fusionMessage = String.IsNullOrEmpty(fileLoadEx.FusionLog)
                                                   ? "Turn on fusion logging to diagnose the problem further. " +
                                           "(Check http://blogs.msdn.com/suzcook/archive" +
                                           "/2003/05/29/57120.aspx for more info)"
                                                   : "Check fusion log: " + fileLoadEx.FusionLog;
                    Log.LogError("The C++/CLI code provider could not be loaded. " +
                                 fileLoadEx.Message +
                                 (fileLoadEx.InnerException?.Message ?? "") +
                                 fusionMessage);
                    provider = null;
                }
                catch (FileNotFoundException)
                {
                    Log.LogError("The C++/CLI code provider wasn't found. " +
                                 "Make sure you have Visual C++ installed.");
                    provider = null;
                }

                outputFile = Path.ChangeExtension(outputFile, ".cpp");
                break;

            default:
                throw new InvalidOperationException("Shouldn't reach here.");
            }

            return(provider);
        }
Esempio n. 32
0
File: xsd.cs Progetto: ydunk/masters
        // Get a code generator for the specified language. language can either be a known abbreviation
        // for C#, VB or JScript. Or it can be a fully-qualified (with assembly) name for an ICodeGenerator
        // or a CodeDomProvider.
        void CreateCodeGenerator(string language, ref ICodeGenerator codeGen, ref string fileExtension)
        {
            CodeDomProvider codeProvider = null;

            if ((string.Compare(language, "CSharp", true) == 0) ||
                (string.Compare(language, "C#", true) == 0) ||
                (string.Compare(language, "CS", true) == 0))
            {
                codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
            }
            else if (string.Compare(language, "VB", true) == 0)
            {
                throw new Exception("VisualBasic not supported in the SSCLI");
            }
            else if ((string.Compare(language, "js", true) == 0) ||
                     (string.Compare(language, "jscript", true) == 0))
            {
                Type t = Type.GetType("Microsoft.JScript.JScriptCodeProvider, " + AssemblyRef.MicrosoftJScript);
                codeProvider = (CodeDomProvider)Activator.CreateInstance(t);
            }
            else
            {
                //try to reflect a custom code generator
                //ignore case when reflecting; language argument must specify the namespace
                Type t = Type.GetType(language, false, true);
                if (t == null)
                {
                    throw new InvalidOperationException(Res.GetString(Res.ErrLanguage, language));
                }
                object o = Activator.CreateInstance(t);
                if (o is CodeDomProvider)
                {
                    codeProvider = (CodeDomProvider)o;
                }
                else if (o is ICodeGenerator)
                {
                    codeGen = (ICodeGenerator)o;
                }
                else
                {
                    throw new InvalidOperationException(Res.GetString(Res.ErrLanguage, language));
                }
            }

            if (codeProvider != null)
            {
                codeGen       = codeProvider.CreateGenerator();
                fileExtension = codeProvider.FileExtension;
                if (fileExtension == null)
                {
                    fileExtension = string.Empty;
                }
                else if (fileExtension.Length > 0 && fileExtension[0] != '.')
                {
                    fileExtension = "." + fileExtension;
                }
            }
            else
            {
                fileExtension = ".src";
            }
        }
Esempio n. 33
0
        /// <summary>
        /// Compiles a given string script
        /// </summary>
        /// <returns>True if compilation ok</returns>
        public bool Compile()
        {
            // Already compiled ?
            if (IsCompiled)
            {
                return(true);
            }

            IsCompiled       = false;
            IsModified       = false;
            HasErrors        = false;
            Errors           = null;
            CompiledAssembly = null;

            // Generate the compiler provider
            switch (Language)
            {
            case ScriptLanguage.CSharp:
            {
                ScriptProvider = new Microsoft.CSharp.CSharpCodeProvider();
                if (ScriptProvider == null)
                {
                    Trace.WriteLine("Failed to initialize a new instance of the CSharpCodeProvider class");

                    return(false);
                }
            }
            break;

            case ScriptLanguage.VBNet:
            {
                ScriptProvider = new Microsoft.VisualBasic.VBCodeProvider();
                if (ScriptProvider == null)
                {
                    Trace.WriteLine("Failed to initialize a new instance of the VBCodeProvider class");
                    return(false);
                }
            }
            break;

            default:
            {
                Trace.WriteLine("Unknown scripting language !!!");
                return(false);
            }
            }



            // Compile
            CompilerResults results = ScriptProvider.CompileAssemblyFromSource(Params, sourceCode);

            if (results.Errors.Count == 0)
            {
                CompiledAssembly = results.CompiledAssembly;
                IsCompiled       = true;
                return(true);
            }



            Errors    = results.Errors;
            HasErrors = true;

            Trace.WriteLine("Compile complete -- " + Errors.Count + " error(s).");

            foreach (CompilerError error in Errors)
            {
                Trace.WriteLine("line " + error.Line + " : " + error.ErrorText);
            }



            return(IsCompiled);
        }
        public void GenerateCode(CodeDomGenerator.Language language)
        {
            switch (language)
            {
            case CodeDomGenerator.Language.CSharp:
                using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
                {
                    System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                    using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                    {
                        if (_params.Count != 1 || _params[0].Type != null)
                        {
                            tw.Write("(");
                        }

                        for (int i = 0; i < _params.Count; i++)
                        {
                            if (i > 0)
                            {
                                tw.Write(", ");
                            }

                            if (_params[i].Type != null)
                            {
                                provider.GenerateCodeFromExpression(new CodeTypeReferenceExpression(_params[i].Type), tw, opts);
                                tw.Write(" ");
                            }

                            tw.Write(_params[i].Name);
                        }

                        if (_params.Count != 1 || _params[0].Type != null)
                        {
                            tw.Write(")");
                        }

                        tw.WriteLine(" => ");
                        tw.WriteLine("{");
                        tw.Indent++;
                        foreach (CodeStatement statement in Statements)
                        {
                            provider.GenerateCodeFromStatement(statement, tw, opts);
                        }
                        tw.Indent--;
                        tw.Write("}");
                        Value = tw.InnerWriter.ToString();
                    }
                }
                break;

            case CodeDomGenerator.Language.VB:
                using (Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider())
                {
                    System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                    using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                    {
                        throw new NotImplementedException();
                        //tw.Write("Function(");

                        //for (int i = 0; i < _params.Count; i++)
                        //{
                        //    if (i > 0)
                        //        tw.Write(", ");

                        //    tw.Write(_params[i].Name);

                        //    if (_params[i].Type != null)
                        //    {
                        //        tw.Write(" As ");
                        //        provider.GenerateCodeFromExpression(new CodeTypeReferenceExpression(_params[i].Type), tw, opts);
                        //    }
                        //}

                        //tw.Write(") ");
                        //provider.GenerateCodeFromExpression(Statements, tw, opts);
                        //Value = tw.InnerWriter.ToString();
                    }
                }
                break;

            default:
                throw new NotImplementedException(language.ToString());
            }
        }
Esempio n. 35
0
        private string GenerateDataSet(DataSet pDs, string pNamespace, string pTableName, string pSchemaName, string pDatabaseName)
        {
            Microsoft.CSharp.CSharpCodeProvider cp = new Microsoft.CSharp.CSharpCodeProvider();
            CodeNamespace cns = new CodeNamespace(pNamespace);

            //get autoincrement column if available
            string sAutoIncColName = IdentityColumnName;

            //set autoincrement seed and step to -1
            if (!String.IsNullOrEmpty(sAutoIncColName) && checkBoxPkIsIdentity.Checked)
            {
                pDs.Tables[0].Columns[sAutoIncColName].AutoIncrement     = true;
                pDs.Tables[0].Columns[sAutoIncColName].AutoIncrementStep = -1;
                pDs.Tables[0].Columns[sAutoIncColName].AutoIncrementSeed = -1;
            }

            using (StringWriter schemaWr = new StringWriter())
            {
                pDs.WriteXmlSchema(schemaWr);
                System.Data.Design.TypedDataSetGenerator.Generate(schemaWr.ToString(), new CodeCompileUnit(), cns, cp, System.Data.Design.TypedDataSetGenerator.GenerateOption.LinqOverTypedDatasets);
            }

            string name = cns.Types[0].Name;

            //Change DataSet type name
            name = pDs.Tables[0].TableName + textBoxDataSetSuffix.Text;
            cns.Types[0].Name = name;

            CodeMemberMethod   oClone = (CodeMemberMethod)FindMember("Clone", cns.Types[0].Members);
            CodeCastExpression exp    =
                new CodeCastExpression(name,
                                       new CodeMethodInvokeExpression(
                                           new CodeMethodReferenceExpression(
                                               new CodeBaseReferenceExpression(), "Clone"),
                                           new CodePrimitiveExpression[] { }));

            CodeVariableDeclarationStatement cvds = new CodeVariableDeclarationStatement(name, "cln", exp);

            oClone.Statements[0] = cvds;

            foreach (CodeAttributeDeclaration cad in cns.Types[0].CustomAttributes)
            {
                if (cad.Name == "System.ComponentModel.ToolboxItem")
                {
                    ((CodePrimitiveExpression)cad.Arguments[0].Value).Value = false;
                    break;
                }
            }

            // Find DataTable.
            // Add Attributes.

            CodeTypeDeclaration oDataTable = (CodeTypeDeclaration)FindMember(pTableName + "DataTable", cns.Types[0].Members);

            AddTableSchemaMember(oDataTable, pSchemaName);
            AddDatabaseMember(oDataTable, pDatabaseName);
            AddFullTableNameMember(oDataTable, TableFullName);
            AddFullTableNameAttribute(oDataTable, TableFullName);

            // Add HasAutoIcrementColumn and AutoIncrementColumnName properties...
            AddAutoIncrementColNameMember(oDataTable, sAutoIncColName);
            if (sAutoIncColName == string.Empty)
            {
                AddHasAutoIncrementMember(oDataTable, false);
            }
            else
            {
                AddHasAutoIncrementMember(oDataTable, true);
            }

            AddAutoIncrementColumnNameAttribute(oDataTable, sAutoIncColName);

            //Change dataset name in Initvars method.
            CodeMemberMethod oInitClass = (CodeMemberMethod)FindMember("InitClass", cns.Types[0].Members);

            ((CodeAssignStatement)oInitClass.Statements[0]).Right = new CodePrimitiveExpression(name);

            //Change dataset type in GetTypedDataSetSchema method.
            CodeMemberMethod                 oGetTypedDataSetSchema = (CodeMemberMethod)FindMember("GetTypedDataSetSchema", cns.Types[0].Members);
            CodeObjectCreateExpression       exp2  = new CodeObjectCreateExpression(name, new CodePrimitiveExpression[] { });
            CodeVariableDeclarationStatement cvds2 = new CodeVariableDeclarationStatement(name, "ds", exp2);

            oGetTypedDataSetSchema.Statements[0] = cvds2;

            //Change type in GetTypedTableSchema of table.
            oGetTypedDataSetSchema = (CodeMemberMethod)FindMember("GetTypedTableSchema", ((CodeTypeDeclaration)FindMember(pDs.Tables[0].TableName + "DataTable", cns.Types[0].Members)).Members);
            exp2  = new CodeObjectCreateExpression(name, new CodePrimitiveExpression[] { });
            cvds2 = new CodeVariableDeclarationStatement(name, "ds", exp2);
            oGetTypedDataSetSchema.Statements[2] = cvds2;

            StringBuilder        sb  = new StringBuilder();
            TextWriter           tw  = new StringWriter(sb);
            CodeGeneratorOptions cgo = new CodeGeneratorOptions();

            cp.GenerateCodeFromNamespace(cns, tw, cgo);
            return(sb.ToString());
        }
Esempio n. 36
0
        public void CompileAndRun(string language, string code, string[] references, Dictionary <string, object> variablevalues, CodeActivityContext context)
        {
            CompilerResults compile = null;

            if (!cache.ContainsKey(code))
            {
                CompilerParameters CompilerParams  = new CompilerParameters();
                string             outputDirectory = System.IO.Directory.GetCurrentDirectory();

                //CompilerParams.GenerateInMemory = true;
                CompilerParams.TreatWarningsAsErrors   = false;
                CompilerParams.GenerateExecutable      = false;
                CompilerParams.CompilerOptions         = "/optimize /d:DEBUG";
                CompilerParams.IncludeDebugInformation = true;
                CompilerParams.GenerateInMemory        = false;
                CompilerParams.OutputAssembly          = System.IO.Path.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid().ToString().Replace("-", "") + ".dll");

                CompilerParams.ReferencedAssemblies.AddRange(references);
                // CompilerParams.ReferencedAssemblies.Add(@"C:\code\openrpa\bin\Microsoft.Office.Tools.Excel.dll");
                CodeDomProvider provider = null;
                if (language == "VB")
                {
                    provider = new Microsoft.VisualBasic.VBCodeProvider();
                }
                else
                {
                    provider = new Microsoft.CSharp.CSharpCodeProvider();
                }
                compile = provider.CompileAssemblyFromSource(CompilerParams, new[] { code });

                if (compile.Errors.HasErrors)
                {
                    string text = "";
                    foreach (CompilerError ce in compile.Errors)
                    {
                        if (!ce.IsWarning)
                        {
                            text += ce.ToString();
                            Log.Error(ce.ToString());
                        }
                    }
                    throw new Exception(text);
                }
                cache.Add(code, compile);
            }
            else
            {
                compile = cache[code];
            }
            //ExpoloreAssembly(compile.CompiledAssembly);
            Module     module   = compile.CompiledAssembly.GetModules()[0];
            Type       mt       = null;
            MethodInfo methInfo = null;

            if (module != null)
            {
                mt = module.GetType("Expression");
            }
            if (module != null && mt == null)
            {
                mt = module.GetType("SomeNamespace.Expression");
            }
            if (mt != null)
            {
                methInfo = mt.GetMethod("ExpressionValue");
                foreach (var v in variablevalues)
                {
                    var p = mt.GetField(v.Key);
                    if (p != null)
                    {
                        p.SetValue(mt, v.Value);
                    }
                }
            }

            if (methInfo != null)
            {
                ExceptionDispatchInfo exceptionDispatchInfo = null;
                try
                {
                    methInfo.Invoke(null, new object[] { });
                }
                catch (Exception ex)
                {
                    exceptionDispatchInfo = ExceptionDispatchInfo.Capture(ex);
                }

                if (exceptionDispatchInfo != null)
                {
                    exceptionDispatchInfo.Throw();
                }

                var vars = context.DataContext.GetProperties();
                foreach (dynamic v in vars)
                {
                    var p = mt.GetField(v.DisplayName);
                    if (p == null)
                    {
                        continue;
                    }
                    var value = p.GetValue(mt);
                    v.SetValue(context.DataContext, value);
                }
            }
        }
Esempio n. 37
0
        public Type GetProxyTypeForStateInterface()
        {
            if (_proxyTypeCache == null)
            {
                List <Type> typesRequired = new List <Type>();
                typesRequired.Add(_interfaceType);

                // Create a code compile unit and a namespace
                CodeCompileUnit ccu = new CodeCompileUnit();
                CodeNamespace   ns  = new CodeNamespace("Esmf.StateTypes");

                // Add some imports statements to the namespace
                ns.Imports.Add(new CodeNamespaceImport("System"));
                // ns.Imports.Add(new CodeNamespaceImport("System.Drawing"));

                // Add the namespace to the code compile unit
                ccu.Namespaces.Add(ns);

                string implementationTypeName = _interfaceName.StartsWith("I", StringComparison.OrdinalIgnoreCase) ? _interfaceName.Substring(1) : String.Format("{0}Implementation", _interfaceName);
                CodeTypeDeclaration ctd       = new CodeTypeDeclaration(implementationTypeName);
                ctd.BaseTypes.Add(_interfaceType);
                ctd.BaseTypes.Add(typeof(IStateObjectConnections));


                ns.Types.Add(ctd);

                foreach (StateFieldStructure field in _fields)
                {
                    if (!typesRequired.Contains(field.Type))
                    {
                        typesRequired.Add(field.Type);
                    }

                    if (field.Dimensions.Count == 0)
                    {
                        CodeTypeReference tt = new CodeTypeReference(field.Type);

                        CodeTypeReference ttGetter = new CodeTypeReference(typeof(NonDimensionalFieldGetter <>));
                        ttGetter.TypeArguments.Add(tt);
                        string          _fieldGetter   = String.Format("_{0}FieldGetter", field.Name);
                        CodeMemberField newGetterField = new CodeMemberField(ttGetter, _fieldGetter);
                        ctd.Members.Add(newGetterField);

                        CodeMemberProperty p = new CodeMemberProperty();
                        p.Name        = String.Format("{0}.{1}", _interfaceType, field.Name);
                        p.Type        = tt;
                        p.Attributes -= MemberAttributes.Private;
                        CodeStatementCollection getStatements = p.GetStatements;

                        getStatements.Add(
                            new CodeConditionStatement(
                                new CodeBinaryOperatorExpression(
                                    new CodeFieldReferenceExpression(
                                        new CodeThisReferenceExpression(),
                                        _fieldGetter),
                                    CodeBinaryOperatorType.IdentityInequality,
                                    new CodePrimitiveExpression(null)),
                                new CodeStatement[] { new CodeMethodReturnStatement(new CodeDelegateInvokeExpression(new CodeEventReferenceExpression(new CodeThisReferenceExpression(), _fieldGetter))) },
                                new CodeStatement[] { new CodeThrowExceptionStatement(new CodeObjectCreateExpression(new CodeTypeReference(typeof(InvalidOperationException)))) }));

                        if (field.CanWrite)
                        {
                            CodeTypeReference ttSetter = new CodeTypeReference(typeof(NonDimensionalFieldSetter <>));
                            ttSetter.TypeArguments.Add(tt);
                            string          _fieldSetter   = String.Format("_{0}FieldSetter", field.Name);
                            CodeMemberField newSetterField = new CodeMemberField(ttSetter, _fieldSetter);
                            ctd.Members.Add(newSetterField);

                            CodeStatementCollection setStatements = p.SetStatements;

                            setStatements.Add(
                                new CodeConditionStatement(
                                    new CodeBinaryOperatorExpression(
                                        new CodeFieldReferenceExpression(
                                            new CodeThisReferenceExpression(),
                                            _fieldSetter),
                                        CodeBinaryOperatorType.IdentityInequality,
                                        new CodePrimitiveExpression(null)),
                                    new CodeStatement[] { new CodeExpressionStatement(new CodeDelegateInvokeExpression(new CodeEventReferenceExpression(new CodeThisReferenceExpression(), _fieldSetter), new CodeExpression[] { new CodePropertySetValueReferenceExpression() })) },
                                    new CodeStatement[] { new CodeThrowExceptionStatement(new CodeObjectCreateExpression(new CodeTypeReference(typeof(InvalidOperationException)))) }));
                        }

                        ctd.Members.Add(p);
                    }
                    else if (field.Dimensions.Count > 0)
                    {
                        CodeTypeReference tt;
                        if (field.CanWrite)
                        {
                            if (field.Dimensions.Count == 1)
                            {
                                tt = new CodeTypeReference(typeof(Esmf.IVariable1Dimensional <,>));
                            }
                            else if (field.Dimensions.Count == 2)
                            {
                                tt = new CodeTypeReference(typeof(Esmf.IVariable2Dimensional <, ,>));
                            }
                            else
                            {
                                throw new InvalidOperationException("Can't have parameters with more than 2 dimensions");
                            }
                        }
                        else
                        {
                            if (field.Dimensions.Count == 1)
                            {
                                tt = new CodeTypeReference(typeof(Esmf.IParameter1Dimensional <,>));
                            }
                            else if (field.Dimensions.Count == 2)
                            {
                                tt = new CodeTypeReference(typeof(Esmf.IParameter2Dimensional <, ,>));
                            }
                            else
                            {
                                throw new InvalidOperationException("Can't have fields with more than 2 dimensions");
                            }
                        }

                        foreach (StateFieldDimensionStructure sfds in field.Dimensions)
                        {
                            tt.TypeArguments.Add(sfds.Type);

                            if (!typesRequired.Contains(sfds.Type))
                            {
                                typesRequired.Add(sfds.Type);
                            }
                        }
                        tt.TypeArguments.Add(field.Type);

                        string          fieldName = String.Format("_{0}Field", field.Name);
                        CodeMemberField newField  = new CodeMemberField(tt, fieldName);
                        ctd.Members.Add(newField);

                        CodeMemberProperty p = new CodeMemberProperty();
                        p.Name        = String.Format("{0}.{1}", _interfaceType, field.Name);
                        p.Type        = tt;
                        p.Attributes -= MemberAttributes.Private;
                        CodeStatementCollection statements = p.GetStatements;

                        statements.Add(
                            new CodeConditionStatement(
                                new CodeBinaryOperatorExpression(
                                    new CodeFieldReferenceExpression(
                                        new CodeThisReferenceExpression(),
                                        fieldName),
                                    CodeBinaryOperatorType.IdentityInequality,
                                    new CodePrimitiveExpression(null)),
                                new CodeStatement[] { new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldName)) },
                                new CodeStatement[] { new CodeThrowExceptionStatement(new CodeObjectCreateExpression(new CodeTypeReference(typeof(InvalidOperationException)))) }));
                        ctd.Members.Add(p);
                    }
                }


                GenerateCodeForIStateObjectConnection(ctd);

                CodeDomProvider    provider = new Microsoft.CSharp.CSharpCodeProvider();
                CompilerParameters cp       = new CompilerParameters();
                cp.ReferencedAssemblies.Add("System.dll");
                cp.ReferencedAssemblies.Add(typeof(IParameter1Dimensional <,>).Module.FullyQualifiedName);

                List <string> modules = new List <string>();
                foreach (Type t in typesRequired)
                {
                    if (!modules.Contains(t.Module.FullyQualifiedName))
                    {
                        modules.Add(t.Module.FullyQualifiedName);
                    }
                }

                foreach (string s in modules)
                {
                    cp.ReferencedAssemblies.Add(s);
                }


                cp.GenerateInMemory = true;
                string assemblyDirectory = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "Temp");
                if (!Directory.Exists(assemblyDirectory))
                {
                    Directory.CreateDirectory(assemblyDirectory);
                }
                cp.OutputAssembly = Path.Combine(assemblyDirectory, string.Format("AutoGenerated{0}.dll", Guid.NewGuid()));
                CompilerResults results = provider.CompileAssemblyFromDom(cp, ccu);
                if (results.Errors.HasErrors)
                {
                    foreach (CompilerError err in results.Errors)
                    {
                        Console.WriteLine();
                        Console.WriteLine(err);
                    }
                }

                //CodeDomProvider provider2 = new Microsoft.CSharp.CSharpCodeProvider();
                //using (System.IO.TextWriter output = System.IO.File.CreateText(@"C:\Users\davidanthoff\Documents\Visual Studio 2005\Projects\test.cs"))
                //{
                //    provider2.GenerateCodeFromCompileUnit(ccu, output, new CodeGeneratorOptions());
                //}

                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

                _proxyTypeCache = results.CompiledAssembly.GetType("Esmf.StateTypes." + implementationTypeName);

                AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve);

                return(_proxyTypeCache);
            }
            else
            {
                return(_proxyTypeCache);
            }
        }
Esempio n. 38
0
        static void Main(string[] args)
        {
            var stopWatch = new System.Diagnostics.Stopwatch();

            stopWatch.Start();

            string codeToCompile = @"
                    public class SomeClass
                    {
                        public int Add42 (int parameter)
                        {
                            return parameter += 42;
                        }
                    }";

            Dictionary <string, string> providerOptions = new Dictionary <string, string>
            {
                { "CompilerVersion", "v4.0" }
            };
            var csCodeProvider = new Microsoft.CSharp.CSharpCodeProvider(providerOptions);

            var compilerParameters = new System.CodeDom.Compiler.CompilerParameters
            {
                GenerateExecutable = false,
                GenerateInMemory   = true
            };

            System.CodeDom.Compiler.CompilerResults compilerResults = csCodeProvider.CompileAssemblyFromSource(compilerParameters, codeToCompile);

            stopWatch.Stop();
            Console.WriteLine(string.Format("compile time: {0}", stopWatch.Elapsed));
            stopWatch.Restart();

            object typeInstance = compilerResults.CompiledAssembly.CreateInstance("SomeClass");

            System.Reflection.MethodInfo mi = typeInstance.GetType().GetMethod("Add42");

            int i, methodOutput;
            var parameterList = new object[1];

            for (i = 0; i < 1000000; i++)
            {
                parameterList[0] = i;
                methodOutput     = (int)mi.Invoke(typeInstance, parameterList);
            }

            stopWatch.Stop();
            Console.WriteLine(string.Format("time to call function {0} times: {1}", i.ToString("##,#"), stopWatch.Elapsed));

            stopWatch.Restart();

            for (i = 0; i < 1000000; i++)
            {
                methodOutput = Add43(i);
            }

            stopWatch.Stop();
            Console.WriteLine(string.Format("time to call function {0} times: {1}", i.ToString("##,#"), stopWatch.Elapsed));

            Console.ReadLine();
        }
Esempio n. 39
0
        public CSharpScript(string code)
        {
            using (var provider =
                       new Microsoft.CSharp.CSharpCodeProvider())
            {
                var builder = new StringBuilder();
                builder
                .AppendLine("using System;")
                .AppendLine("using System.Collections.Generic;")
                .AppendLine("using System.Linq;")
                .AppendLine("using System.Reflection;")
                .AppendLine("using System.Text;")
                .AppendLine("public class CompiledScript")
                .AppendLine("{")
                .AppendLine("private Dictionary<String, dynamic> dict = new Dictionary<string,dynamic>();")
                .AppendLine("public dynamic this[string name]")
                .AppendLine("{")
                .AppendLine("get")
                .AppendLine("{")
                .AppendLine("return dict[name];")
                .AppendLine("}")
                .AppendLine("set")
                .AppendLine("{")
                .AppendLine("if (dict.ContainsKey(name))")
                .AppendLine("dict[name] = value;")
                .AppendLine("else")
                .AppendLine("dict.Add(name, value);")
                .AppendLine("}")
                .AppendLine("}")
                .AppendLine("public dynamic Execute()")
                .AppendLine("{")
                .Append(code)
                .Append("return null;")
                .AppendLine("}")
                .AppendLine("}");

                var parameters = new System.CodeDom.Compiler.CompilerParameters()
                {
                    GenerateInMemory = true,
                    CompilerOptions  = "/optimize",
                };
                parameters.ReferencedAssemblies.Add("System.dll");
                parameters.ReferencedAssemblies.Add("System.Core.dll");
                parameters.ReferencedAssemblies.Add("System.Data.dll");
                parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
                parameters.ReferencedAssemblies.Add("System.Drawing.dll");
                parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
                parameters.ReferencedAssemblies.Add("System.Xml.dll");
                parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
                parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");

                var res = provider.CompileAssemblyFromSource(parameters, builder.ToString());

                if (res.Errors.HasErrors)
                {
                    var errorMessage = "";
                    foreach (var error in res.Errors)
                    {
                        errorMessage += error + "\r\n";
                    }
                    throw new ArgumentException(errorMessage, "code");
                }

                var type = res.CompiledAssembly.GetType("CompiledScript");
                CompiledCode = Activator.CreateInstance(type);
            }
        }
Esempio n. 40
0
        /// <summary>
        /// Generates an Assembly from a list of script filenames
        /// </summary>
        /// <param name="filenames">The filenames of the scripts</param>
        /// <param name="references">Assembly references for the script</param>
        /// <returns>The generated assembly</returns>
        public Assembly CreateAssembly(IList filenames, IList references)
        {
            string fileType = null;

            foreach (string filename in filenames)
            {
                string extension = Path.GetExtension(filename);
                if (fileType == null)
                {
                    fileType = extension;
                }
                else if (fileType != extension)
                {
                    throw new ArgumentException("All files in the file list must be of the same type.");
                }
            }

            // ensure that compilerErrors is null
            compilerErrors = null;

            // Select the correct CodeDomProvider based on script file extension
            CodeDomProvider codeProvider = null;

            switch (fileType)
            {
            case ".cs":
                codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                break;

            case ".vb":
                codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                break;

            default:
                throw new InvalidOperationException("Script files must have a .cs, .vb, or .js extension, for C#, Visual Basic.NET, or JScript respectively.");
            }


            // Set compiler parameters
            CompilerParameters compilerParams = new CompilerParameters();

            compilerParams.CompilerOptions         = "/target:library /optimize";
            compilerParams.GenerateExecutable      = false;
            compilerParams.GenerateInMemory        = true;
            compilerParams.IncludeDebugInformation = false;
            compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
            compilerParams.ReferencedAssemblies.Add("System.dll");

            // Add custom references
            foreach (string reference in references)
            {
                if (!compilerParams.ReferencedAssemblies.Contains(reference))
                {
                    compilerParams.ReferencedAssemblies.Add(reference);
                }
            }

            // Do the compilation
            CompilerResults results = codeProvider.CompileAssemblyFromFile(
                compilerParams, (string[])ArrayList.Adapter(filenames).ToArray(typeof(string)));


            if (results.Errors.Count > 0)
            {
                StringBuilder sb = new StringBuilder();
                foreach (CompilerError item in results.Errors)
                {
                    sb.AppendFormat("{0} line:{1}   {2}\r\n", item.FileName, item.Line, item.ErrorText);
                }
                compilerErrors = results.Errors;
                throw new Exception(
                          "Compiler error(s)\r\n" + sb.ToString());
            }

            Assembly createdAssembly = results.CompiledAssembly;

            return(createdAssembly);
        }
Esempio n. 41
0
        private static Type BuildTypeCodeDom(Type baseInterface, string className, string fieldsPrefix, params Type[] types)
        {
            var           compileUnit     = new CodeCompileUnit();
            CodeNamespace globalNamespace = new CodeNamespace();

            globalNamespace.Imports.Add(new CodeNamespaceImport("System"));
            globalNamespace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));
            globalNamespace.Imports.Add(new CodeNamespaceImport("System.Linq"));
            globalNamespace.Imports.Add(new CodeNamespaceImport("System.Text"));

            var classNamespace = new CodeNamespace("STS.General.Data");

            var generatedClass = new CodeTypeDeclaration(className);

            generatedClass.IsClass    = true;
            generatedClass.Attributes = MemberAttributes.Public;

            for (int i = 0; i < types.Length; i++)
            {
                generatedClass.TypeParameters.Add(new CodeTypeParameter("T" + fieldsPrefix + i));
            }

            if (baseInterface != null)
            {
                generatedClass.BaseTypes.Add(baseInterface);
            }

            var serializableAttribute = new CodeTypeReference(typeof(System.SerializableAttribute));

            generatedClass.CustomAttributes.Add(new CodeAttributeDeclaration(serializableAttribute));

            classNamespace.Types.Add(generatedClass);

            compileUnit.Namespaces.Add(globalNamespace);
            compileUnit.Namespaces.Add(classNamespace);

            CodeMemberField[] fields = new CodeMemberField[types.Length];

            for (int i = 0; i < fields.Length; i++)
            {
                fields[i]            = new CodeMemberField("T" + fieldsPrefix + i, fieldsPrefix + i);
                fields[i].Attributes = MemberAttributes.Public;
                generatedClass.Members.Add(fields[i]);
            }

            CodeConstructor defaultConstructor = new CodeConstructor();

            defaultConstructor.Attributes = MemberAttributes.Public;

            generatedClass.Members.Add(defaultConstructor);

            CodeConstructor constructor = new CodeConstructor();

            constructor.Attributes = MemberAttributes.Public;

            for (int i = 0; i < types.Length; i++)
            {
                CodeTypeReference type = new CodeTypeReference("T" + fieldsPrefix + i);
                constructor.Parameters.Add(new CodeParameterDeclarationExpression(type, fieldsPrefix.ToLower() + i));
            }

            for (int i = 0; i < types.Length; i++)
            {
                CodeFieldReferenceExpression left = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), fieldsPrefix + i);
                constructor.Statements.Add(new CodeAssignStatement(left, new CodeArgumentReferenceExpression(fieldsPrefix.ToLower() + i)));
            }

            generatedClass.Members.Add(constructor);

            string stsdbAssemblyName = Assembly.GetExecutingAssembly().Location;

            string[] assemblies = { "System.dll", "mscorlib.dll", stsdbAssemblyName };

            CompilerParameters parameters = new CompilerParameters(assemblies);

            CodeDomProvider runTimeProvider = new Microsoft.CSharp.CSharpCodeProvider();

            parameters = new CompilerParameters(assemblies);

            parameters.GenerateExecutable      = false;
            parameters.GenerateInMemory        = true;
            parameters.IncludeDebugInformation = true;
            parameters.CompilerOptions         = "/optimize";

            CompilerResults compilerResults = runTimeProvider.CompileAssemblyFromDom(parameters, compileUnit);
            var             generatedType   = compilerResults.CompiledAssembly.GetTypes()[0];

            return(generatedType.MakeGenericType(types));
        }
Esempio n. 42
0
        public void HiddenAssemblyTest()
        {
            const string code = @"
                                namespace Foo
                                {
                                    public class HiddenAssemblyLogger
                                    {
                                        public void LogDebug(NLog.Logger logger)
                                        {
                                            logger.Debug(""msg"");
                                        }
                                    }
                                }
                              ";

            var provider   = new Microsoft.CSharp.CSharpCodeProvider();
            var parameters = new System.CodeDom.Compiler.CompilerParameters();

            // reference the NLog dll
            parameters.ReferencedAssemblies.Add("NLog.dll");

            // the assembly should be generated in memory
            parameters.GenerateInMemory = true;

            // generate a dll instead of an executable
            parameters.GenerateExecutable = false;

            // compile code and generate assembly
            System.CodeDom.Compiler.CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);

            Assert.False(results.Errors.HasErrors, "Compiler errors: " + string.Join(";", results.Errors));

            // create nlog configuration
            LogManager.Configuration = CreateConfigurationFromString(@"
            <nlog>
                <targets><target name='debug' type='Debug' layout='${callsite} ${message}' /></targets>
                <rules>
                    <logger name='*' minlevel='Debug' writeTo='debug' />
                </rules>
            </nlog>");

            // create logger
            Logger logger = LogManager.GetLogger("A");

            // load HiddenAssemblyLogger type
            Assembly compiledAssembly         = results.CompiledAssembly;
            Type     hiddenAssemblyLoggerType = compiledAssembly.GetType("Foo.HiddenAssemblyLogger");

            Assert.NotNull(hiddenAssemblyLoggerType);

            // load methodinfo
            MethodInfo logDebugMethod = hiddenAssemblyLoggerType.GetMethod("LogDebug");

            Assert.NotNull(logDebugMethod);

            // instantiate the HiddenAssemblyLogger from previously generated assembly
            object instance = Activator.CreateInstance(hiddenAssemblyLoggerType);

            // Add the previously generated assembly to the "blacklist"
            LogManager.AddHiddenAssembly(compiledAssembly);

            // call the log method
            logDebugMethod.Invoke(instance, new object[] { logger });

            MethodBase currentMethod = MethodBase.GetCurrentMethod();

            AssertDebugLastMessage("debug", currentMethod.DeclaringType.FullName + "." + currentMethod.Name + " msg");
        }
Esempio n. 43
0
        private static Assembly GenerateTestAssembly()
        {
            const string code = @"
                using System;
                using System.Reflection;

                [assembly: AssemblyVersion(""" + AssemblyVersionTest + @""")]
                [assembly: AssemblyFileVersion(""" + AssemblyFileVersionTest + @""")]
                [assembly: AssemblyInformationalVersion(""" + AssemblyInformationalVersionTest + @""")]

                namespace LogTester
                {
                    public class LoggerTest
                    {
                        public void TestLog(NLog.Logger logger, Assembly assembly)
                        {
                            if (System.Reflection.Assembly.GetEntryAssembly() == null)
                            {
                                // In some unit testing scenarios we cannot find the entry assembly
                                // So we attempt to force this to be set, which can also still fail
                                // This is not expected to be necessary in Visual Studio
                                // See https://github.com/Microsoft/vstest/issues/649
                                try
                                {
                                    SetEntryAssembly(assembly);
                                }
                                catch (InvalidOperationException ioex)
                                {
                                    logger.Debug(ioex, ""Skip: No entry assembly"");
                                    return;
                                }
                            }

                            logger.Debug(""Pass: Test fully executed"");
                        }

                        private static void SetEntryAssembly(Assembly assembly)
                        {
                            var manager = new AppDomainManager();

                            var domain = AppDomain.CurrentDomain;
                            if (domain == null)
                                throw new InvalidOperationException(""Current app domain is null"");

                            var entryAssemblyField = manager.GetType().GetField(""m_entryAssembly"", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (entryAssemblyField == null)
                                throw new InvalidOperationException(""Unable to find field m_entryAssembly"");
                            entryAssemblyField.SetValue(manager, assembly);

                            var domainManagerField = domain.GetType().GetField(""_domainManager"", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (domainManagerField == null)
                                throw new InvalidOperationException(""Unable to find field _domainManager"");
                            domainManagerField.SetValue(domain, manager);
                        }
                    }
                }";

            var provider   = new Microsoft.CSharp.CSharpCodeProvider();
            var parameters = new System.CodeDom.Compiler.CompilerParameters
            {
                GenerateInMemory     = true,
                GenerateExecutable   = false,
                ReferencedAssemblies = { "NLog.dll" }
            };

            System.CodeDom.Compiler.CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);
            var compiledAssembly = results.CompiledAssembly;

            return(compiledAssembly);
        }
Esempio n. 44
0
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (textEditor == null)
            {
                Log.Error("textEditor is null?");
                return;
            }
            this.errors.Text = "";
            var    language = textEditor.SyntaxHighlighting.Name;
            var    code     = textEditor.Text;
            string error    = "";

            try
            {
                textEditor.ShowLineNumbers = true;
                //if (language == "VB" || language == "C#")
                //{
                //    textEditor.ShowLineNumbers = false;
                //}
            }
            catch (Exception ex)
            {
                Log.Error("set ShowLineNumbers: " + ex.ToString());
            }
            var newtitle = "Editor";

            Task.Run(() => {
                if (language == "VB" || language == "C#")
                {
                    var variables = new Dictionary <string, Type>();
                    foreach (var variableModel in Variables)
                    {
                        var variable = variableModel.GetCurrentValue() as System.Activities.LocationReference;
                        variables.Add(variable.Name, variable.Type);
                    }
                    if (language == "VB")
                    {
                        var header   = CodeEditor.CodeEditor.GetVBHeaderText(variables, "Expression", textEditor.Namespaces);
                        int numLines = header.Split('\n').Length;
                        Log.Information("Header (add to line numbers): " + numLines);
                        newtitle = "Editor (Add " + numLines + " to line numbers)";
                    }
                    else if (language == "C#")
                    {
                        var header   = CodeEditor.CodeEditor.GetCSharpHeaderText(variables, "Expression", textEditor.Namespaces);
                        int numLines = header.Split('\n').Length;
                        Log.Information("Header (add to line numbers): " + numLines);
                        newtitle = "Editor (Add " + numLines + " to line numbers)";
                    }

                    string sourcecode    = code;
                    textEditor.Variables = variables;
                    if (language == "VB")
                    {
                        sourcecode = CodeEditor.CodeEditor.GetVBHeaderText(variables, "Expression", textEditor.Namespaces) + code + CodeEditor.CodeEditor.GetVBFooterText();
                    }
                    if (language == "C#")
                    {
                        sourcecode = CodeEditor.CodeEditor.GetCSharpHeaderText(variables, "Expression", textEditor.Namespaces) + code + CodeEditor.CodeEditor.GetCSharpFooterText();
                    }
                    var references     = InvokeCode.GetAssemblyLocations();
                    var CompilerParams = new System.CodeDom.Compiler.CompilerParameters();
                    //CompilerParams.GenerateInMemory = true;
                    CompilerParams.TreatWarningsAsErrors   = false;
                    CompilerParams.GenerateExecutable      = false;
                    CompilerParams.CompilerOptions         = "/optimize /d:DEBUG";
                    CompilerParams.IncludeDebugInformation = true;
                    CompilerParams.GenerateInMemory        = false;
                    CompilerParams.OutputAssembly          = System.IO.Path.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid().ToString().Replace("-", "") + ".dll");

                    CompilerParams.ReferencedAssemblies.AddRange(references);
                    // CompilerParams.ReferencedAssemblies.Add(@"C:\code\openrpa\bin\Microsoft.Office.Tools.Excel.dll");
                    System.CodeDom.Compiler.CodeDomProvider provider = null;
                    if (language == "VB")
                    {
                        provider = new Microsoft.VisualBasic.VBCodeProvider();
                    }
                    else
                    {
                        provider = new Microsoft.CSharp.CSharpCodeProvider();
                    }
                    System.CodeDom.Compiler.CompilerResults compile = provider.CompileAssemblyFromSource(CompilerParams, new[] { sourcecode });

                    if (compile.Errors.HasErrors)
                    {
                        string text = "Compile error: ";
                        foreach (System.CodeDom.Compiler.CompilerError ce in compile.Errors)
                        {
                            text += "rn" + ce.ToString();
                        }
                        error = text;
                    }
                }
                if (language == "PowerShell")
                {
                    Collection <System.Management.Automation.PSParseError> errors;
                    System.Management.Automation.PSParser.Tokenize(code, out errors);
                    if (errors != null && errors.Count > 0)
                    {
                        foreach (var _e in errors.Take(5))
                        {
                            error += "(" + _e.Token.StartLine + ":" + _e.Token.StartColumn + ") " + _e.Message + Environment.NewLine;
                        }
                    }
                }
                if (language == "AutoHotkey")
                {
                    //if (sharpAHK.ahkGlobal.ahkdll == null) { InvokeCode.New_AHKSession(true); }
                    //sharpAHK.ahkGlobal.ahkdll.Reset();
                    //try
                    //{
                    //    //sharpAHK.ahkGlobal.ahkdll.LoadScript(code);
                    //}
                    //catch (Exception ex)
                    //{
                    //    error = ex.ToString();
                    //}
                }
                if (language == "Python")
                {
                    //var engine = IronPython.Hosting.Python.CreateEngine();
                    //var source = engine.CreateScriptSourceFromString(code, Microsoft.Scripting.SourceCodeKind.Statements);
                    //var errors = new ErrorListener();
                    //var command = source.Compile(errors);
                    //if (command == null)
                    //{
                    //    foreach (var _e in errors.errors.Take(5))
                    //    {
                    //        error += _e.source.ToString() + "(" + _e.span.Start + "): " + _e.message + Environment.NewLine;
                    //    }
                    //}
                }
                GenericTools.RunUI(this, () =>
                {
                    Title                  = newtitle;
                    this.errors.Text       = error;
                    this.errors.Visibility = (string.IsNullOrEmpty(this.errors.Text) ? Visibility.Hidden : Visibility.Visible);
                });
            });
        }
Esempio n. 45
0
        CompilePackageAssembly(
            bool enforceBamAssemblyVersions = true,
            bool enableClean = true)
        {
            // validate build root
            if (null == Graph.Instance.BuildRoot)
            {
                throw new Exception("Build root has not been specified");
            }

            var gatherSourceProfile = new TimeProfile(ETimingProfiles.GatherSource);

            gatherSourceProfile.StartProfile();

            IdentifyAllPackages(enforceBamAssemblyVersions: enforceBamAssemblyVersions);

            var cleanFirst = CommandLineProcessor.Evaluate(new Options.CleanFirst());

            if (enableClean && cleanFirst && System.IO.Directory.Exists(Graph.Instance.BuildRoot))
            {
                Log.Info("Deleting build root '{0}'", Graph.Instance.BuildRoot);
                try
                {
                    // make sure no files are read-only, which may have happened as part of collation preserving file attributes
                    var dirInfo = new System.IO.DirectoryInfo(Graph.Instance.BuildRoot);
                    foreach (var file in dirInfo.EnumerateFiles("*", System.IO.SearchOption.AllDirectories))
                    {
                        file.Attributes &= ~System.IO.FileAttributes.ReadOnly;
                    }

                    System.IO.Directory.Delete(Graph.Instance.BuildRoot, true);
                }
                catch (System.IO.IOException ex)
                {
                    Log.Info("Failed to delete build root, because {0}. Continuing", ex.Message);
                }
            }

            BuildModeUtilities.ValidateBuildModePackage();

            var definitions = new StringArray();

            // gather source files
            var sourceCode   = new StringArray();
            int packageIndex = 0;

            foreach (var package in Graph.Instance.Packages)
            {
                Log.DebugMessage("{0}: '{1}' @ '{2}'", packageIndex, package.Version, (package.PackageRepositories.Count > 0) ? package.PackageRepositories[0] : "Not in a repository");

                // to compile with debug information, you must compile the files
                // to compile without, we need to file contents to hash the source
                if (Graph.Instance.CompileWithDebugSymbols)
                {
                    var scripts = package.GetScriptFiles();
                    sourceCode.AddRange(scripts);
                    Log.DebugMessage(scripts.ToString("\n\t"));
                }
                else
                {
                    foreach (var scriptFile in package.GetScriptFiles())
                    {
                        using (var reader = new System.IO.StreamReader(scriptFile))
                        {
                            sourceCode.Add(reader.ReadToEnd());
                        }
                        Log.DebugMessage("\t'{0}'", scriptFile);
                    }
                }

                foreach (var define in package.Definitions)
                {
                    if (!definitions.Contains(define))
                    {
                        definitions.Add(define);
                    }
                }

                ++packageIndex;
            }

            // add/remove other definitions
            definitions.Add(VersionDefineForCompiler);
            definitions.Add(HostPlatformDefineForCompiler);
            definitions.AddRange(Features.PreprocessorDefines);
            definitions.Sort();

            gatherSourceProfile.StopProfile();

            var assemblyCompileProfile = new TimeProfile(ETimingProfiles.AssemblyCompilation);

            assemblyCompileProfile.StartProfile();

            // assembly is written to the build root
            var cachedAssemblyPathname = System.IO.Path.Combine(Graph.Instance.BuildRoot, ".CachedPackageAssembly");

            cachedAssemblyPathname = System.IO.Path.Combine(cachedAssemblyPathname, Graph.Instance.MasterPackage.Name) + ".dll";
            var    hashPathName = System.IO.Path.ChangeExtension(cachedAssemblyPathname, "hash");
            string thisHashCode = null;

            var cacheAssembly = !CommandLineProcessor.Evaluate(new Options.DisableCacheAssembly());

            string compileReason = null;

            if (Graph.Instance.CompileWithDebugSymbols)
            {
                compileReason = "debug symbols were enabled";
            }
            else
            {
                // can an existing assembly be reused?
                thisHashCode = GetPackageHash(sourceCode, definitions, Graph.Instance.MasterPackage.BamAssemblies);
                if (cacheAssembly)
                {
                    if (System.IO.File.Exists(hashPathName))
                    {
                        using (var reader = new System.IO.StreamReader(hashPathName))
                        {
                            var diskHashCode = reader.ReadLine();
                            if (diskHashCode.Equals(thisHashCode))
                            {
                                Log.DebugMessage("Cached assembly used '{0}', with hash {1}", cachedAssemblyPathname, diskHashCode);
                                Log.Detail("Re-using existing package assembly");
                                Graph.Instance.ScriptAssemblyPathname = cachedAssemblyPathname;

                                assemblyCompileProfile.StopProfile();
                                return;
                            }
                            else
                            {
                                compileReason = "package source has changed since the last compile";
                            }
                        }
                    }
                    else
                    {
                        compileReason = "no previously compiled package assembly exists";
                    }
                }
                else
                {
                    compileReason = "user has disabled package assembly caching";
                }
            }

            // use the compiler in the current runtime version to build the assembly of packages
            var clrVersion = System.Environment.Version;

            Log.Detail("Compiling package assembly, CLR {0}{1}, because {2}.",
                       clrVersion.ToString(),
                       Graph.Instance.ProcessState.TargetFrameworkVersion != null ? (", targetting " + Graph.Instance.ProcessState.TargetFrameworkVersion) : string.Empty,
                       compileReason);

            var providerOptions = new System.Collections.Generic.Dictionary <string, string>();
            var compilerVersion = System.String.Format("v{0}.{1}", clrVersion.Major, clrVersion.Minor);

            providerOptions.Add("CompilerVersion", compilerVersion);

            if (Graph.Instance.ProcessState.RunningMono)
            {
                Log.DebugMessage("Compiling assembly for Mono");
            }

            using (var provider = new Microsoft.CSharp.CSharpCodeProvider(providerOptions))
            {
                var compilerParameters = new System.CodeDom.Compiler.CompilerParameters();
                compilerParameters.TreatWarningsAsErrors = true;
                compilerParameters.WarningLevel          = 4;
                compilerParameters.GenerateExecutable    = false;
                compilerParameters.GenerateInMemory      = false;

                if (Graph.Instance.CompileWithDebugSymbols)
                {
                    compilerParameters.OutputAssembly = System.IO.Path.Combine(System.IO.Path.GetTempPath(), Graph.Instance.MasterPackage.Name) + ".dll";
                }
                else
                {
                    compilerParameters.OutputAssembly = cachedAssemblyPathname;
                }

                var compilerOptions = "/checked+ /unsafe-";
                if (Graph.Instance.CompileWithDebugSymbols)
                {
                    compilerParameters.IncludeDebugInformation = true;
                    compilerOptions += " /optimize-";
                }
                else
                {
                    compilerOptions += " /optimize+";
                }
                compilerOptions += " /platform:anycpu";

                // define strings
                compilerOptions += " /define:" + definitions.ToString(';');

                compilerParameters.CompilerOptions = compilerOptions;

                if (provider.Supports(System.CodeDom.Compiler.GeneratorSupport.Resources))
                {
                    // Bam assembly
                    // TODO: Q: why is it only for the master package? Why not all of them, which may have additional dependencies?
                    foreach (var assembly in Graph.Instance.MasterPackage.BamAssemblies)
                    {
                        var assemblyFileName = System.String.Format("{0}.dll", assembly.Name);
                        var assemblyPathName = System.IO.Path.Combine(Graph.Instance.ProcessState.ExecutableDirectory, assemblyFileName);
                        compilerParameters.ReferencedAssemblies.Add(assemblyPathName);
                    }

                    // DotNet assembly
                    foreach (var desc in Graph.Instance.MasterPackage.DotNetAssemblies)
                    {
                        var assemblyFileName = System.String.Format("{0}.dll", desc.Name);
                        compilerParameters.ReferencedAssemblies.Add(assemblyFileName);
                    }

                    if (Graph.Instance.ProcessState.RunningMono)
                    {
                        compilerParameters.ReferencedAssemblies.Add("Mono.Posix.dll");
                    }
                }
                else
                {
                    throw new Exception("C# compiler does not support Resources");
                }

                // this will create the build root directory as necessary
                IOWrapper.CreateDirectory(System.IO.Path.GetDirectoryName(compilerParameters.OutputAssembly));

                var results = Graph.Instance.CompileWithDebugSymbols ?
                              provider.CompileAssemblyFromFile(compilerParameters, sourceCode.ToArray()) :
                              provider.CompileAssemblyFromSource(compilerParameters, sourceCode.ToArray());

                if (results.Errors.HasErrors || results.Errors.HasWarnings)
                {
                    var message = new System.Text.StringBuilder();
                    message.AppendFormat("Failed to compile package '{0}'. There are {1} errors.", Graph.Instance.MasterPackage.FullName, results.Errors.Count);
                    message.AppendLine();
                    foreach (System.CodeDom.Compiler.CompilerError error in results.Errors)
                    {
                        message.AppendFormat("\t{0}({1}): {2} {3}", error.FileName, error.Line, error.ErrorNumber, error.ErrorText);
                        message.AppendLine();
                    }
                    if (!Graph.Instance.CompileWithDebugSymbols)
                    {
                        message.AppendLine();
                        ICommandLineArgument debugOption = new Options.UseDebugSymbols();
                        message.AppendFormat("Use the {0}/{1} command line option with bam for more accurate error messages.", debugOption.LongName, debugOption.ShortName);
                        message.AppendLine();
                    }
                    message.AppendLine();
                    ICommandLineArgument createDebugProjectOption = new Options.CreateDebugProject();
                    message.AppendFormat("Use the {0}/{1} command line option with bam to create an editable IDE project containing the build scripts.", createDebugProjectOption.LongName, createDebugProjectOption.ShortName);
                    message.AppendLine();
                    throw new Exception(message.ToString());
                }

                if (!Graph.Instance.CompileWithDebugSymbols)
                {
                    if (cacheAssembly)
                    {
                        using (var writer = new System.IO.StreamWriter(hashPathName))
                        {
                            writer.WriteLine(thisHashCode);
                        }
                    }
                    else
                    {
                        // will not throw if the file doesn't exist
                        System.IO.File.Delete(hashPathName);
                    }
                }

                Log.DebugMessage("Written assembly to '{0}'", compilerParameters.OutputAssembly);
                Graph.Instance.ScriptAssemblyPathname = compilerParameters.OutputAssembly;
            }

            assemblyCompileProfile.StopProfile();
        }
Esempio n. 46
0
        private void OnMESCall1()
        {
            try
            {
                //WEB服务地址
                string url = this.textBoxMesAddr.Text;
                //客户端代理服务命名空间,可以设置成需要的值。
                string ns = string.Format("JCJProxMES");
                //获取WSDL
                WebClient          wc        = new WebClient();
                Stream             stream    = wc.OpenRead(url + "?WSDL");
                ServiceDescription sd        = ServiceDescription.Read(stream);//服务的描述信息都可以通过ServiceDescription获取
                string             classname = sd.Services[0].Name;

                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
                sdi.AddServiceDescription(sd, "", "");
                CodeNamespace cn = new CodeNamespace(ns);

                //生成客户端代理类代码
                CodeCompileUnit ccu = new CodeCompileUnit();
                ccu.Namespaces.Add(cn);
                sdi.Import(cn, ccu);
                Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();

                //设定编译参数
                System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();
                cplist.GenerateExecutable = false;
                cplist.GenerateInMemory   = true;
                cplist.ReferencedAssemblies.Add("System.dll");
                cplist.ReferencedAssemblies.Add("System.XML.dll");
                cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
                cplist.ReferencedAssemblies.Add("System.Data.dll");

                //编译代理类
                System.CodeDom.Compiler.CompilerResults cr = csc.CompileAssemblyFromDom(cplist, ccu);
                if (cr.Errors.HasErrors == true)
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(System.Environment.NewLine);
                    }
                    throw new Exception(sb.ToString());
                }
                //生成代理实例
                System.Reflection.Assembly assembly = cr.CompiledAssembly;
                Type   t   = assembly.GetType(ns + "." + classname, true, true);
                object obj = Activator.CreateInstance(t);

                //实例化方法
                System.Reflection.MethodInfo helloWorld = t.GetMethod("DxTestDataUpload");

                //设置参数

                object device         = textBox1.Text.Trim();
                object workstation_sn = textBox2.Text.Trim();
                object emp_no         = textBox3.Text.Trim();
                object mo_number      = textBox4.Text.Trim();
                object container_no   = textBox5.Text.Trim();
                object product_sn     = textBox6.Text.Trim();
                object union_list     = textBox7.Text.Trim();


                object mod_level = textBox8.Text.Trim();
                object test_re   = textBox9.Text.Trim();
                object test_val  = textBox10.Text.Trim();

                object   test_time = textBox11.Text.Trim();
                object   mark      = textBox12.Text.Trim();
                object   m_flag    = int.Parse(textBox13.Text.Trim());
                object[] addParams = new object[] { m_flag, device, workstation_sn, emp_no, mo_number, container_no, product_sn, union_list, mod_level, test_re, test_val, test_time, mark };

                //参数赋值并调用方法
                object helloWorldReturn = helloWorld.Invoke(obj, addParams);

                Console.WriteLine(helloWorldReturn.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
Esempio n. 47
0
        /// <summary>
        /// 加载运行脚本
        /// </summary>
        /// <param name="strCode"></param>
        private void StartScript(string strCode)
        {
            //创建应用域
            var appSetup = new AppDomainSetup();

            appSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
            var appdomain = AppDomain.CreateDomain("ClientSpace", null, appSetup);

            //创建编译器
            var provider = new Microsoft.CSharp.CSharpCodeProvider();
            //配置编译参数
            var compilerParameters = new System.CodeDom.Compiler.CompilerParameters();

            compilerParameters.ReferencedAssemblies.Add("System.dll");
            compilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            compilerParameters.ReferencedAssemblies.Add("System.Drawing.dll");
            compilerParameters.GenerateInMemory = false;
            compilerParameters.OutputAssembly   = "client.dll";

            //读取代码编译
            var usercore        = Spoonson.Apps.SuperTerm.Properties.Resources.usercore;
            var compilerResults = provider.CompileAssemblyFromSource(compilerParameters, usercore, strCode);

            if (compilerResults.Errors.HasErrors)
            {
                string strErrorMessage = "";
                for (int i = 0; i < compilerResults.Errors.Count; i++)
                {
                    strErrorMessage += "\r\nline: " + compilerResults.Errors[i].Line.ToString() + " " + compilerResults.Errors[i].ErrorText + Environment.NewLine;
                }
                Logger.Error("编译失败 " + compilerResults.Errors.Count);
                Logger.Error(strErrorMessage);

                return;
            }
            compilerResults = null;

            //创建用户线程
            StopScript();

            ScriptProcess = new System.Threading.Thread(new System.Threading.ThreadStart(delegate()
            {
                try
                {
                    var bfi          = BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance;
                    var remoteLoader = appdomain.CreateInstanceFrom("RemoteLoader.dll", "Spoonson.Common.RemoteLoader", false, bfi, null, null, null, null).Unwrap() as Spoonson.Common.RemoteLoader;
                    var plugin       = remoteLoader.Create("client.dll", "UserSpace.UserCode", new object[] { Controller });
                    plugin           = null;
                }
                catch (System.Threading.ThreadAbortException e)
                {
                    //处理线程终止过程
                    Logger.Error(e.ToString());
                    Logger.Warn("线程被用户终止");
                }
                finally
                {
                    AppDomain.Unload(appdomain);
                    appdomain = null;
                    System.IO.File.Delete("client.dll");
                }
            }));
            ScriptProcess.Start();
        }
Esempio n. 48
0
        public static void Generate(
            string output_path,
            List <CodeTypeDelegate> delegates,
            List <CodeMemberMethod> functions,
            List <CodeMemberField> constants
            )
        {
            string filename = Path.Combine(output_path, Properties.Bind.Default.OutputClass + ".cs");

            if (!Directory.Exists(Properties.Bind.Default.OutputPath))
            {
                Directory.CreateDirectory(Properties.Bind.Default.OutputPath);
            }

            CodeNamespace ns = new CodeNamespace(Properties.Bind.Default.OutputNamespace);

            ns.Imports.Add(new CodeNamespaceImport("System"));
            ns.Imports.Add(new CodeNamespaceImport("System.Runtime.InteropServices"));
            ns.Imports.Add(new CodeNamespaceImport("System.Text"));

            foreach (string key in SpecTranslator.CSTypes.Keys)
            {
                ns.Imports.Add(new CodeNamespaceImport(key + " = System." + SpecTranslator.CSTypes[key].BaseType));
            }

            constants.Sort(new CodeTypeNameComparer <CodeMemberField>());
            functions.Sort(new CodeTypeNameComparer <CodeMemberMethod>());
            delegates.Sort(new CodeTypeNameComparer <CodeTypeDelegate>());

            ns.Types.Add(GenerateGlClass(functions, constants));
            ns.Types.Add(GenerateDelegatesClass(delegates));
            ns.Types.Add(GenerateImportsClass(delegates));

            CodeCompileUnit cu = new CodeCompileUnit();

            /*
             * cu.AssemblyCustomAttributes.Add(
             *  new CodeAttributeDeclaration(
             *      "System.CLSCompliant",
             *      new CodeAttributeArgument[] {
             *          new CodeAttributeArgument(
             *              new CodeSnippetExpression("true")
             *          )
             *      }
             *  )
             * );
             */
            cu.StartDirectives.Add(new CodeDirective());
            cu.Namespaces.Add(ns);

            using (StreamWriter sw = new StreamWriter(filename, false))
            {
                Console.WriteLine("Writing Tao.OpenGl.Gl class to {0}", filename);

                Microsoft.CSharp.CSharpCodeProvider          cs      = new Microsoft.CSharp.CSharpCodeProvider();
                System.CodeDom.Compiler.CodeGeneratorOptions options = new System.CodeDom.Compiler.CodeGeneratorOptions();
                options.BracingStyle             = "C";
                options.BlankLinesBetweenMembers = false;
                options.VerbatimOrder            = true;

                cs.GenerateCodeFromCompileUnit(cu, sw, options);

                sw.Flush();
            }
        }
Esempio n. 49
0
        public FactoryIF getFactory(int level)
        {
            if (level.Equals(1))
            {
                return(new LevelOneFactory());
            }
            else if (level.Equals(2))
            {
                return(new LevelTwoFactory());
            }
            else if (level.Equals(3))
            {
                return(new LevelThreeFactory());
            }
            else if (level.Equals(4))
            {
                return(new LevelFourFactory());
            }
            else if (level.Equals(5))
            {
                return(new LevelFiveFactory());
            }
            else
            {
                try
                {
                    LevelPlayer player = LevelPlayer.getInstance();
                    string      dlevel = player.getFile();
                    String      code;
                    String      line;
                    //Pass the file path and file name to the StreamReader constructor

                    StreamReader sr = new StreamReader(dlevel);

                    //Read the first line of text
                    line = sr.ReadLine();
                    code = line;
                    //Continue to read until you reach end of file
                    while (line != null)
                    {
                        //Read the next line
                        line = sr.ReadLine();
                        code = code + "\n" + line;
                    }

                    //close the file
                    sr.Close();

                    Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
                    ICodeCompiler compiler = provider.CreateCompiler();
                    System.CodeDom.Compiler.CompilerParameters compilerparams = new CompilerParameters();
                    compilerparams.GenerateExecutable = false;
                    compilerparams.GenerateInMemory   = true;
                    compilerparams.ReferencedAssemblies.Add("System.dll");
                    compilerparams.ReferencedAssemblies.Add("System.Core.dll");
                    compilerparams.ReferencedAssemblies.Add(typeof(Program).Assembly.Location);
                    CompilerResults results  = compiler.CompileAssemblyFromSource(compilerparams, code);
                    Assembly        compiled = null;
                    if (results.Errors.HasErrors)
                    {
                        StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
                        foreach (CompilerError error in results.Errors)
                        {
                            errors.AppendFormat("Line {0},{1}\t: {2}\n",
                                                error.Line, error.Column, error.ErrorText);
                        }
                        throw new Exception(errors.ToString());
                    }
                    else
                    {
                        compiled = results.CompiledAssembly;
                    }
                    int last = dlevel.LastIndexOf('\\');
                    last += 1;
                    Type      type   = compiled.GetType("WordBlaster.AbstractFactory." + dlevel.Substring(last, (dlevel.Count() - last - 4)));
                    FactoryIF dynlvl = (FactoryIF)Activator.CreateInstance(type);
                    return(dynlvl);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Could not load file, starting normally...");
                    return(new LevelOneFactory()); //if we could not load it in just start normally
                }
            }
        }
Esempio n. 50
0
        public void GenerateCode(CodeDomGenerator.Language language)
        {
            switch (language)
            {
            case CodeDomGenerator.Language.CSharp:
                using (Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider())
                {
                    System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                    using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                    {
                        tw.Write("while (");
                        if (TestExpression != null)
                        {
                            provider.GenerateCodeFromExpression(TestExpression, tw, opts);
                        }
                        tw.WriteLine(")");
                        tw.WriteLine("{");
                        tw.Indent++;
                        if (Statements != null)
                        {
                            foreach (CodeStatement statement in Statements)
                            {
                                provider.GenerateCodeFromStatement(statement, tw, opts);
                            }
                        }
                        tw.Indent--;
                        tw.WriteLine("}");
                        Value = tw.InnerWriter.ToString();
                    }
                }
                break;

            case CodeDomGenerator.Language.VB:
                using (Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider())
                {
                    System.CodeDom.Compiler.CodeGeneratorOptions opts = new System.CodeDom.Compiler.CodeGeneratorOptions();
                    using (System.CodeDom.Compiler.IndentedTextWriter tw = new System.CodeDom.Compiler.IndentedTextWriter(new StringWriter(), opts.IndentString))
                    {
                        tw.Write("Do While ");
                        if (TestExpression != null)
                        {
                            provider.GenerateCodeFromExpression(TestExpression, tw, opts);
                        }
                        tw.WriteLine();
                        tw.Indent++;
                        if (Statements != null)
                        {
                            foreach (CodeStatement statement in Statements)
                            {
                                provider.GenerateCodeFromStatement(statement, tw, opts);
                            }
                        }
                        tw.Indent--;
                        tw.WriteLine("Loop");
                        Value = tw.InnerWriter.ToString();
                    }
                }
                break;

            default:
                throw new NotImplementedException(language.ToString());
            }
        }
Esempio n. 51
0
        private void CreateResourceFromImage(bool entire)
        {
            Bitmap bitmap = null;

            if (entire)
            {
                bitmap = (Bitmap)(zoomPanControl.ZoomPanImage.Clone());
            }
            else if (HasImageSelection && !entire)
            {
                bitmap = ((Bitmap)zoomPanControl.ZoomPanImage).Clone(partBox, ((Bitmap)zoomPanControl.ZoomPanImage).PixelFormat);
            }
            if (bitmap != null)
            {
                if (Statics.DTE.Solution.IsOpen)
                {
                    foreach (EnvDTE.Project proj in Statics.DTE.Solution.Projects)
                    {
                        if (proj.Name.Contains("Test"))
                        {
                            try
                            {
                                string resFile, resDesignFile, resNameSpace;
                                System.CodeDom.Compiler.CodeDomProvider provider;
                                if (proj.FileName.EndsWith("vbproj"))
                                {
                                    resFile       = Path.GetDirectoryName(proj.FileName) + @"\My Project\Resources.resx";
                                    resDesignFile = Path.GetDirectoryName(proj.FileName) + @"\My Project\Resources.Designer.vb";
                                    vbNS          = resNameSpace = proj.Properties.Item("RootNamespace").Value.ToString();
                                    provider      = new Microsoft.VisualBasic.VBCodeProvider();
                                }
                                else
                                {
                                    resFile       = Path.GetDirectoryName(proj.FileName) + @"\Properties\Resources.resx";
                                    resDesignFile = Path.GetDirectoryName(proj.FileName) + @"\Properties\Resources.Designer.cs";
                                    resNameSpace  = proj.Properties.Item("DefaultNamespace").Value + ".Properties";
                                    provider      = new Microsoft.CSharp.CSharpCodeProvider();
                                }
                                ImageInputForm inputForm = new ImageInputForm();
                                inputForm.ShowDialog();

                                System.Resources.ResXResourceReader reader = new System.Resources.ResXResourceReader(resFile);
                                using (System.Resources.ResXResourceWriter writer = new System.Resources.ResXResourceWriter(resFile + ".new"))
                                {
                                    System.Collections.IDictionaryEnumerator iterator = reader.GetEnumerator();
                                    while (iterator.MoveNext())
                                    {
                                        writer.AddResource(iterator.Key.ToString(), iterator.Value);
                                    }
                                    writer.AddResource(inputForm.Input, bitmap);
                                    writer.Generate();
                                }
                                File.Copy(resFile + ".new", resFile, true);
                                File.Delete(resFile + ".new");
                                string[] unMatched;
                                System.CodeDom.CodeCompileUnit unit = System.Resources.Tools.StronglyTypedResourceBuilder.Create(resFile, "Resources",
                                                                                                                                 resNameSpace,
                                                                                                                                 provider,
                                                                                                                                 true, out unMatched);
                                using (StreamWriter designWriter = new StreamWriter(resDesignFile))
                                {
                                    provider.GenerateCodeFromCompileUnit(unit, designWriter,
                                                                         new System.CodeDom.Compiler.CodeGeneratorOptions());
                                }
                                MessageBox.Show("Image generation succeeded", "Resources Updated");
                                if (entire)
                                {
                                    entireResName = inputForm.Input;
                                    NotifyPropertyChanged("EntireResName");
                                }
                                else
                                {
                                    partResName = inputForm.Input;
                                    NotifyPropertyChanged("PartialResName");
                                }

                                return;
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show("Image generation failed\n" + ex.Message, "Resources Did Not Update");
                                return;
                            }
                        }
                    }
                    MessageBox.Show("You need to have a project open, named *Test*", "Resources Did Not Update");
                    return;
                }
                MessageBox.Show("You need to have a solution open with a project named *Test*", "Resources Did Not Update");
                return;
            }
        }
Esempio n. 52
0
        internal void GenerateCode(LazyTextWriterCreator target)
        {
            Debug.Assert(target != null, "target parameter is null");

            IndentedTextWriter indentedTextWriter = null;

            System.IO.Stream       tempFileStream = null;
            System.IO.StreamReader reader         = null;
            System.IO.StreamWriter writer         = null;
            TempFileCollection     tempFiles      = null;

            try
            {
                CodeDomProvider provider = null;
                switch (Language)
                {
                case LanguageOption.GenerateCSharpCode:
                    provider = new Microsoft.CSharp.CSharpCodeProvider();
                    break;

                case LanguageOption.GenerateVBCode:
                    provider = new Microsoft.VisualBasic.VBCodeProvider();
                    break;
                }

                _isLanguageCaseSensitive = (provider.LanguageOptions & LanguageOptions.CaseInsensitive) == 0;

                new NamespaceEmitter(this, this.NamespacePrefix, target.TargetFilePath).Emit();

                // if there were errors we don't need the output file
                if (RealErrorsExist)
                {
                    return;
                }

                if (FixUps.Count == 0 || !FixUpCollection.IsLanguageSupported(Language))
                {
                    indentedTextWriter = new IndentedTextWriter(target.GetOrCreateTextWriter(), "\t");
                }
                else
                {
                    // need to write to a temporary file so we can do fixups...
                    tempFiles = new TempFileCollection(Path.GetTempPath());
                    string filename = Path.Combine(tempFiles.TempDir, "EdmCodeGenFixup-" + Guid.NewGuid().ToString() + ".tmp");
                    tempFiles.AddFile(filename, false);
                    tempFileStream = new System.IO.FileStream(filename, System.IO.FileMode.CreateNew, System.IO.FileAccess.ReadWrite,
                                                              System.IO.FileShare.None);
                    indentedTextWriter = new IndentedTextWriter(new System.IO.StreamWriter(tempFileStream), "\t");
                }

                CodeGeneratorOptions styleOptions = new CodeGeneratorOptions();
                styleOptions.BracingStyle             = "C";
                styleOptions.BlankLinesBetweenMembers = false;
                styleOptions.VerbatimOrder            = true;
                provider.GenerateCodeFromCompileUnit(CompileUnit, indentedTextWriter, styleOptions);

                // if we wrote to a temp file need to post process the file...
                if (tempFileStream != null)
                {
                    indentedTextWriter.Flush();
                    tempFileStream.Seek(0, System.IO.SeekOrigin.Begin);
                    reader = new System.IO.StreamReader(tempFileStream);
                    FixUps.Do(reader, target.GetOrCreateTextWriter(), Language, !String.IsNullOrEmpty(SourceObjectNamespaceName));
                }
            }
            catch (System.UnauthorizedAccessException ex)
            {
                AddError(ModelBuilderErrorCode.SecurityError, EdmSchemaErrorSeverity.Error, ex);
            }
            catch (System.IO.FileNotFoundException ex)
            {
                AddError(ModelBuilderErrorCode.FileNotFound, EdmSchemaErrorSeverity.Error, ex);
            }
            catch (System.Security.SecurityException ex)
            {
                AddError(ModelBuilderErrorCode.SecurityError, EdmSchemaErrorSeverity.Error, ex);
            }
            catch (System.IO.DirectoryNotFoundException ex)
            {
                AddError(ModelBuilderErrorCode.DirectoryNotFound, EdmSchemaErrorSeverity.Error, ex);
            }
            catch (System.IO.IOException ex)
            {
                AddError(ModelBuilderErrorCode.IOException, EdmSchemaErrorSeverity.Error, ex);
            }
            finally
            {
                if (indentedTextWriter != null)
                {
                    indentedTextWriter.Close();
                }
                if (tempFileStream != null)
                {
                    tempFileStream.Close();
                }
                if (tempFiles != null)
                {
                    tempFiles.Delete();
                    ((IDisposable)tempFiles).Dispose();
                }
                if (reader != null)
                {
                    reader.Close();
                }
                if (writer != null)
                {
                    writer.Close();
                }
            }
        }
Esempio n. 53
0
        static void Main()
        {
            Inventory store1 = new Inventory();

            store1.pencils = 5;
            store1.pens    = 10;
            store1.paper   = 15;
            DataContractSerializer surrogateDcs =
                new DataContractSerializer(typeof(Inventory), null, int.MaxValue, false, false, new InventoryTypeSurrogate());

            // Plug in the surrogate in order to use the serializer.
            Console.WriteLine("Plug in a surrogate for the Inventory class\n");
            StringWriter sw2 = new StringWriter();
            XmlWriter    xw2 = XmlWriter.Create(sw2);

            try
            {
                surrogateDcs.WriteObject(xw2, store1);
            }
            catch (InvalidDataContractException)
            {
                Console.WriteLine(" We should never get here");
            }
            xw2.Flush();
            sw2.Flush();
            Console.Write(sw2.ToString());
            Console.WriteLine("\n\n Serialization succeeded. Now doing deserialization...\n");

            StringReader tr       = new StringReader(sw2.ToString());
            XmlReader    xr       = XmlReader.Create(tr);
            Inventory    newstore = (Inventory)surrogateDcs.ReadObject(xr);

            Console.Write("Deserialized Inventory data: \nPens:" + newstore.pens + "\nPencils: " + newstore.pencils + "\nPaper: " + newstore.paper);

            Console.WriteLine("\n\n Deserialization succeeded. Now doing schema export/import...\n");

            //The following code demonstrates schema export with a surrogate.
            //The surrogate indicates how to export the non-DataContract Inventory type.
            //Without the surrogate, schema export would fail.
            XsdDataContractExporter xsdexp = new XsdDataContractExporter();

            xsdexp.Options = new ExportOptions();
            xsdexp.Options.DataContractSurrogate = new InventoryTypeSurrogate();
            try
            {
                xsdexp.Export(typeof(Inventory));
            }
            catch (Exception) { }

            //Write out exported schema to a file
            using (FileStream fs = new FileStream("sample.xsd", FileMode.Create))
            {
                foreach (XmlSchema sch in xsdexp.Schemas.Schemas())
                {
                    sch.Write(fs);
                }
            }

            //The following code demonstrates schema import with a surrogate.
            //The surrogate is used to indicate that the Inventory class already exists
            //and that there is no need to generate a new class when importing the
            //"InventorySurrogated" data contract.

            XsdDataContractImporter xsdimp = new XsdDataContractImporter();

            xsdimp.Options = new ImportOptions();
            xsdimp.Options.DataContractSurrogate = new InventoryTypeSurrogate();
            xsdimp.Import(xsdexp.Schemas);

            //Write out the imported schema to a C-Sharp file
            using (FileStream fs = new FileStream("sample.cs", FileMode.Create))
            {
                TextWriter      tw  = new StreamWriter(fs);
                CodeDomProvider cdp = new Microsoft.CSharp.CSharpCodeProvider();
                cdp.GenerateCodeFromCompileUnit(xsdimp.CodeCompileUnit, tw, null);
                tw.Flush();
            }

            Console.WriteLine("\n\n To see the results of schema export and import,");
            Console.WriteLine(" see SAMPLE.XSD and SAMPLE.CS.\n");

            Console.WriteLine(" Press ENTER to terminate the sample.\n");
            Console.ReadLine();
        }
Esempio n. 54
0
        /// <summary>
        /// Generate a C# assembly, compile it and load it up
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void generateCSharpButton_Click(object sender, System.EventArgs e)
        {
            CodeExpression[] emptyParams = new CodeExpression[] { };

            // Generate the C# for the control
            CodeCompileUnit ccu = new CodeCompileUnit( );

            // Create a namespace
            CodeNamespace ns = new CodeNamespace("MyControls");

            // Add some imports statements
            ns.Imports.Add(new CodeNamespaceImport("System"));
            ns.Imports.Add(new CodeNamespaceImport("System.Drawing"));
            ns.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));

            // Add the namespace to the code compile unit
            ccu.Namespaces.Add(ns);

            // Now create the class
            CodeTypeDeclaration ctd = new CodeTypeDeclaration("MyControl");

            ctd.BaseTypes.Add(typeof(System.Windows.Forms.UserControl));

            // Add the type to the namespace
            ns.Types.Add(ctd);

            // Add the default constructor
            CodeConstructor constructor = new CodeConstructor( );

            constructor.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression( ), "InitializeComponent", emptyParams));

            constructor.Attributes = MemberAttributes.Public;

            ctd.Members.Add(constructor);

            // Create the private member variable to hold the label
            CodeMemberField labelField = new CodeMemberField(typeof(System.Windows.Forms.Label), "_label");

            ctd.Members.Add(labelField);

            // Now add the InitializeComponent method
            CodeMemberMethod initializeComponent = new CodeMemberMethod( );

            initializeComponent.Name       = "InitializeComponent";
            initializeComponent.ReturnType = new CodeTypeReference(typeof(void));

            CodeAssignStatement labelNew = new CodeAssignStatement(new CodeVariableReferenceExpression("_label"),
                                                                   new CodeObjectCreateExpression(typeof(System.Windows.Forms.Label), emptyParams));

            initializeComponent.Statements.Add(labelNew);

            // Add the SuspendLayout() call
            initializeComponent.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression( ), "SuspendLayout", emptyParams));

            CodeBinaryOperatorExpression leftAndRight = new CodeBinaryOperatorExpression(
                new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(System.Windows.Forms.AnchorStyles)), "Left"),
                CodeBinaryOperatorType.BitwiseOr,
                new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(System.Windows.Forms.AnchorStyles)), "Right"));

            CodeBinaryOperatorExpression topToo = new CodeBinaryOperatorExpression(
                new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(System.Windows.Forms.AnchorStyles)), "Top"),
                CodeBinaryOperatorType.BitwiseOr,
                leftAndRight);

            // Setup the Anchor property of the label
            initializeComponent.Statements.Add(new CodeAssignStatement(
                                                   new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("_label"), "Anchor"),
                                                   topToo));

            // And setup the border style
            initializeComponent.Statements.Add(new CodeAssignStatement(
                                                   new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("_label"), "BorderStyle"),
                                                   new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(System.Windows.Forms.BorderStyle)), "Fixed3D")));

            // Set the location of the control
            initializeComponent.Statements.Add(new CodeAssignStatement(
                                                   new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("_label"), "Location"),
                                                   new CodeObjectCreateExpression(typeof(System.Drawing.Point),
                                                                                  new CodeExpression[] { new CodePrimitiveExpression(8),
                                                                                                         new CodePrimitiveExpression(8) })));

            // Set the name of the control
            initializeComponent.Statements.Add(new CodeAssignStatement(
                                                   new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("_label"), "Name"),
                                                   new CodePrimitiveExpression("_label")));

            // Set the size of the control
            initializeComponent.Statements.Add(new CodeAssignStatement(
                                                   new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("_label"), "Size"),
                                                   new CodeObjectCreateExpression(typeof(System.Drawing.Size),
                                                                                  new CodeExpression[] { new CodePrimitiveExpression(312),
                                                                                                         new CodePrimitiveExpression(23) })));

            // Set the tab index
            initializeComponent.Statements.Add(new CodeAssignStatement(
                                                   new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("_label"), "TabIndex"),
                                                   new CodePrimitiveExpression(0)));

            // And then the text!
            initializeComponent.Statements.Add(new CodeAssignStatement(
                                                   new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("_label"), "Text"),
                                                   new CodePrimitiveExpression(messageText.Text)));

            // Now add the label control to the controls collection
            initializeComponent.Statements.Add(
                new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeThisReferenceExpression( ), "Controls"), "Add",
                                               new CodeExpression[] { new CodeVariableReferenceExpression("_label") }));

            // And set the name of the control to MyControl
            initializeComponent.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression( ), "Name"),
                                                                       new CodePrimitiveExpression("MyControl")));

            // And the size of the control
            initializeComponent.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression( ), "Size"),
                                                                       new CodeObjectCreateExpression(typeof(System.Drawing.Size),
                                                                                                      new CodeExpression[] { new CodePrimitiveExpression(328),
                                                                                                                             new CodePrimitiveExpression(100) })));

            // Add the ResumeLayout ( false ) call
            initializeComponent.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression( ), "ResumeLayout", new CodeExpression [] { new CodePrimitiveExpression(false) }));

            // And finally add initializeComponent to the members for the class
            ctd.Members.Add(initializeComponent);

            // Finally create the C#
            CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider( );

#if DEBUG
            // Generate the source code on disk
            ICodeGenerator generator = provider.CreateGenerator( );

            using (StreamWriter sw = new StreamWriter("code.cs", false))
            {
                CodeGeneratorOptions options = new CodeGeneratorOptions( );
                options.BracingStyle = "C";
                generator.GenerateCodeFromCompileUnit(ccu, sw, options);
            }
#endif

            ICodeCompiler compiler = provider.CreateGenerator( ) as ICodeCompiler;

            CompilerParameters cp = new CompilerParameters(new string[] { "System.dll", "System.Windows.Forms.dll", "System.Drawing.dll" });

            cp.GenerateInMemory = true;
            cp.OutputAssembly   = "AutoGenerated";

            CompilerResults results = compiler.CompileAssemblyFromDom(cp, ccu);

            if (results.Errors.Count == 0)
            {
                Type t = results.CompiledAssembly.GetType("MyControls.MyControl");

                Control c = Activator.CreateInstance(t) as Control;

                c.Dock = DockStyle.Fill;

                controlPanel.SuspendLayout( );
                controlPanel.Controls.Clear( );
                controlPanel.Controls.Add(c);
                controlPanel.ResumeLayout( );
            }
            else
            {
                CompilerError error = results.Errors[0];
                int           i     = 0;
                i++;
            }
        }
Esempio n. 55
0
        /// <summary>
        /// Process a template and returns the processed file.
        /// </summary>
        /// <param name="templateText">The template text.</param>
        /// <returns></returns>
        public string ProcessTemplate(string templateText)
        {
            // Initialize TemplateEngine state
            _doTemplateCode      = new StringBuilder();
            _doTemplateClassCode = new StringBuilder();
            _isTemplateClassCode = false;
            Assembly templateAssembly = null;

            _directives = new List <Directive>();

            // Parse the T4 template text
            Parse(templateText);

            // Build parameters for template
            var parametersCode = new StringBuilder();

            foreach (var parameterValueType in _parameters.Values)
            {
                parametersCode.Append(string.Format(System.Globalization.CultureInfo.InvariantCulture, "public {0} {1} {{ get; set; }}\n", parameterValueType.Type.FullName, parameterValueType.Name));
            }

            // Build import namespaces for template
            var importNamespaceCode = new StringBuilder();

            foreach (var directive in _directives)
            {
                if (directive.Name == "import")
                {
                    importNamespaceCode.Append("using " + directive.Attributes["namespace"] + ";\n");
                }
            }

            // Expand final template class code
            // Parameter {0} = List of import namespaces.
            // Parameter {1} = List of parameters declaration.
            // Parameter {2} = Body of template code
            // Parameter {3} = Body of template class level code
            string templateSourceCode = string.Format(GenericTemplateCodeText, importNamespaceCode, parametersCode, _doTemplateCode, _doTemplateClassCode);

            // Creates the C# compiler, compiling for 3.5
            //var codeProvider = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
            var codeProvider = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary <string, string>()
            {
                { "CompilerVersion", "v4.0" }
            });
            var compilerParameters = new CompilerParameters {
                GenerateInMemory = true, GenerateExecutable = false
            };

            // Adds assembly from CurrentDomain
            // TODO, implement T4 directive "assembly"?
            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                try
                {
                    string location = assembly.Location;
                    if (!String.IsNullOrEmpty(location))
                    {
                        compilerParameters.ReferencedAssemblies.Add(location);
                    }
                }
                catch (NotSupportedException)
                {
                    // avoid problem with previous dynamic assemblies
                }
            }

            // Compiles the code
            var compilerResults = codeProvider.CompileAssemblyFromSource(compilerParameters, templateSourceCode);

            // Output any errors
            foreach (var compilerError in compilerResults.Errors)
            {
                Logger.Error(compilerError.ToString());
            }

            // If successful, gets the compiled assembly
            if (compilerResults.Errors.Count == 0 && compilerResults.CompiledAssembly != null)
            {
                templateAssembly = compilerResults.CompiledAssembly;
                // File.WriteAllText(templateFile + ".txt", src);
            }
            else
            {
                Logger.Fatal("Template [{0}] contains error", TemplateFileName);
            }

            // Get a new templatizer instance
            var templatizer = (Templatizer)Activator.CreateInstance(templateAssembly.GetType("TemplateImpl"));

            // Set all parameters for the template
            foreach (var parameterValueType in _parameters.Values)
            {
                var propertyInfo = templatizer.GetType().GetProperty(parameterValueType.Name);
                propertyInfo.SetValue(templatizer, parameterValueType.Value, null);
            }

            // Run the templatizer
            templatizer.Process();

            // Returns the text
            return(templatizer.ToString());
        }
Esempio n. 56
0
        /// <summary>
        /// Generates an Assembly from a script filename
        /// </summary>
        /// <param name="filename">The filename of the script</param>
        /// <param name="references">Assembly references for the script</param>
        /// <returns>The generated assembly</returns>
        public Assembly CreateAssembly(string filename, IList references)
        {
            // ensure that compilerErrors is null
            compilerErrors = null;

            string extension = Path.GetExtension(filename);

            // Select the correct CodeDomProvider based on script file extension
            CodeDomProvider codeProvider = null;

            switch (extension)
            {
            case ".cs":
                codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                break;

            case ".vb":
                codeProvider = new Microsoft.CSharp.CSharpCodeProvider();
                break;

            case ".js":
                //   codeProvider = new Microsoft.JScript.JScriptCodeProvider();
                break;

            default:
                throw new InvalidOperationException("Script files must have a .cs, .vb, or .js extension, for C#, Visual Basic.NET, or JScript respectively.");
            }

            ICodeCompiler compiler = codeProvider.CreateCompiler();

            // Set compiler parameters
            CompilerParameters compilerParams = new CompilerParameters();

            compilerParams.CompilerOptions         = "/target:library /optimize";
            compilerParams.GenerateExecutable      = false;
            compilerParams.GenerateInMemory        = true;
            compilerParams.IncludeDebugInformation = false;

            compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
            compilerParams.ReferencedAssemblies.Add("System.dll");

            // Add custom references
            foreach (string reference in references)
            {
                if (!compilerParams.ReferencedAssemblies.Contains(reference))
                {
                    compilerParams.ReferencedAssemblies.Add(reference);
                }
            }

            // Do the compilation
            CompilerResults results = compiler.CompileAssemblyFromFile(compilerParams,
                                                                       filename);

            //Do we have any compiler errors
            if (results.Errors.Count > 0)
            {
                compilerErrors = results.Errors;
                throw new Exception(
                          "Compiler error(s) encountered and saved to AssemblyFactory.CompilerErrors");
            }

            Assembly createdAssembly = results.CompiledAssembly;

            return(createdAssembly);
        }
Esempio n. 57
0
        System.Reflection.Assembly _CompileSource(string Input, bool InputIsFile, bool exe, string outputname)
        {
            string[]      asmrefs      = new string[AssemblyReferences.Count];
            List <string> assemblydirs = new List <string>();

            char[] slashes = new char[] { '/', '\\' };
            for (int i = 0; i < asmrefs.Length; i++)
            {
                string ar  = AssemblyReferences[i];
                int    ils = ar.LastIndexOfAny(slashes);
                if (-1 != ils)
                {
                    assemblydirs.Add(ar.Substring(0, ils));
                    ar = ar.Substring(ils + 1);
                }
                asmrefs[i] = ar;
            }
            StringBuilder localcompileropts = new StringBuilder();

            {
                for (int i = 0; i < assemblydirs.Count; i++)
                {
                    localcompileropts.Append(" /lib:\"" + assemblydirs[i] + "\"");
                }
            }
            System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters(asmrefs);
            cp.IncludeDebugInformation = _compilerdbg;
            System.CodeDom.Compiler.CompilerResults cr = null;
            bool   alreadylogged = false;
            string reason        = "";

            for (int rotor = 1; ; rotor++)
            {
#if DEBUG
                if (rotor > 3)
                {
                    throw new System.IO.FileNotFoundException("ArrayComboList.CompileSource dynamic C# compilation: Unable to create DLL" + reason);
                }
#endif
                try
                {
                    cp.OutputAssembly     = outputname;
                    cp.GenerateExecutable = exe;
                    cp.GenerateInMemory   = false;
                    cp.CompilerOptions    = getcompileropts() + localcompileropts.ToString();

                    {
                        System.Threading.Mutex mdc = new System.Threading.Mutex(false, "DynCmp");
                        try
                        {
                            mdc.WaitOne();
                        }
                        catch (System.Threading.AbandonedMutexException)
                        {
                        }
                        try
                        {
                            Dictionary <string, string> providerOptions = new Dictionary <string, string>();
                            providerOptions["CompilerVersion"] = "v3.5";
                            using (Microsoft.CSharp.CSharpCodeProvider cscp = new Microsoft.CSharp.CSharpCodeProvider(providerOptions))
                            {
                                if (InputIsFile)
                                {
                                    cr = cscp.CompileAssemblyFromFile(cp, Input);
                                }
                                else
                                {
                                    cr = cscp.CompileAssemblyFromSource(cp, Input);
                                }
                            }
                        }
                        finally
                        {
                            mdc.ReleaseMutex();
                            mdc.Close();
                        }
                    }
                    if (cr.Errors.HasErrors)
                    {
                        try
                        {
                            lock (typeof(Compiler))
                            {
                                if (InputIsFile)
                                {
                                    System.IO.File.Copy(Input, "error.cs", true); // overwrite=true
                                }
                                else
                                {
                                    System.IO.File.WriteAllText("error.cs", Input);
                                }
                            }
                        }
                        catch
                        {
                        }
                        for (int i = 0; i < cr.Errors.Count; i++)
                        {
                            if (!cr.Errors[i].IsWarning)
                            {
                                throw new Exception("CompileSource code compile error: " + cr.Errors[i].ToString());
                            }
                        }
                        throw new Exception("CompileSource code compile error: " + cr.Errors[0].ToString());
                    }
                    if (0 != cr.NativeCompilerReturnValue)
                    {
                        //LogLine("CompileSource code compile did not return 0 (returned " + cr.NativeCompilerReturnValue.ToString() + "): ");
                        for (int i = 0; i < cr.Output.Count; i++)
                        {
                            string ss = cr.Output[i].Trim();
                            if (0 != ss.Length)
                            {
                                //LogLine("  C" + rotor.ToString() + "- " + cr.Output[i]);
                            }
                        }
                    }
#if DEBUG
                    if (rotor > 1)
                    {
                        System.Threading.Thread.Sleep(1000 * (rotor - 1));
                    }
#else
                    System.Threading.Thread.Sleep(1000 * rotor);
#endif

                    break; // Good.
                }
                catch (System.IO.IOException e)
                {
                    if (!alreadylogged)
                    {
                        alreadylogged = true;
                        //LogLine("Rotor retry: " + e.ToString());
                    }
                    reason = ": " + e.ToString();
                    continue;
                }
            }

            return(cr.CompiledAssembly);
        }
Esempio n. 58
0
        private void OutputGeneratedCode(CodeCompileUnit compileUnit)
        {
            CodeDomProvider generator = null;

            switch (options.Language)
            {
            case SupportedLanguage.CS:
                generator = new Microsoft.CSharp.CSharpCodeProvider();
                break;

            case SupportedLanguage.VB:
                generator = new Microsoft.VisualBasic.VBCodeProvider();
                break;

            case SupportedLanguage.CPP:
                generator = new Microsoft.VisualC.CppCodeProvider();
                break;

            case SupportedLanguage.JS:
                generator = new Microsoft.JScript.JScriptCodeProvider();
                break;

            case SupportedLanguage.PY:
                generator = new PythonProvider();
                break;

            default:
                Console.WriteLine("Unknown language detected. Falling back to default C#");
                generator = new Microsoft.CSharp.CSharpCodeProvider();
                break;
            }

            var genOptions = new CodeGeneratorOptions()
            {
                BlankLinesBetweenMembers = true,
                VerbatimOrder            = false,
                ElseOnClosing            = false,
                BracingStyle             = "C",
                IndentString             = "    "
            };

            if (options.UseFolders)
            {
                foreach (var file in MetaFacade.SplitCompileUnit(compileUnit))
                {
                    var fileInfo = new FileInfo(Path.Combine(options.OutputFile, file.Key) + "." + generator.FileExtension);
                    CheckDirectoryExists(fileInfo.Directory);
                    using (var sw = new StreamWriter(fileInfo.Create()))
                    {
                        generator.GenerateCodeFromCompileUnit(file.Value, sw, genOptions);
                    }
                }
            }
            else
            {
                using (var sw = new StreamWriter(options.OutputFile))
                {
                    generator.GenerateCodeFromCompileUnit(compileUnit, sw, genOptions);
                }
            }
        }
Esempio n. 59
0
        internal static void EmitCodeToAddIntoCustomStdBinding(Type standardBindingType, string generatedElementClassName, string generatedCollectionElementClassName, string srcFile)
        {
            CodeMemberMethod applyCfgMethodForStdBinding = new CodeMemberMethod();

            applyCfgMethodForStdBinding.Name = MethodNameConstants.ApplyConfigurationMethod;

            string paramConfigName = "configurationName";
            CodeVariableReferenceExpression paramVarRef = new CodeVariableReferenceExpression(paramConfigName);

            applyCfgMethodForStdBinding.Parameters.Add(new CodeParameterDeclarationExpression(
                                                           CodeDomHelperObjects.stringTypeRef,
                                                           paramConfigName));

            string bindingsString = "bindings";
            CodeVariableReferenceExpression bindingsVarRef = new CodeVariableReferenceExpression(bindingsString);

            string sectionString = "section";
            CodeVariableReferenceExpression sectionVarRef = new CodeVariableReferenceExpression(sectionString);

            string elementString = "element";
            CodeVariableReferenceExpression elementVarRef = new CodeVariableReferenceExpression(elementString);

            string topLevelSectionNameInConfig = "system.serviceModel/bindings/";
            string subSectionNameInConfig      = Helpers.TurnFirstCharLower(standardBindingType.Name);

            CodeVariableDeclarationStatement bindingsInit = new CodeVariableDeclarationStatement(
                new CodeTypeReference(TypeNameConstants.BindingsSection),
                bindingsString,
                new CodeCastExpression(TypeNameConstants.BindingsSection,
                                       new CodeMethodInvokeExpression(
                                           new CodeTypeReferenceExpression(TypeNameConstants.ConfigurationManager),
                                           MethodNameConstants.GetSectionMethod,
                                           new CodePrimitiveExpression(topLevelSectionNameInConfig))));

            applyCfgMethodForStdBinding.Statements.Add(bindingsInit);

            CodeVariableDeclarationStatement sectionInit = new CodeVariableDeclarationStatement(
                new CodeTypeReference(generatedCollectionElementClassName),
                sectionString,
                new CodeCastExpression(generatedCollectionElementClassName,
                                       new CodeArrayIndexerExpression(
                                           bindingsVarRef,
                                           new CodePrimitiveExpression(subSectionNameInConfig))));

            applyCfgMethodForStdBinding.Statements.Add(sectionInit);

            CodeVariableDeclarationStatement elementInit = new CodeVariableDeclarationStatement(
                new CodeTypeReference(generatedElementClassName),
                elementString,
                new CodeArrayIndexerExpression(
                    new CodeFieldReferenceExpression(
                        sectionVarRef,
                        PropertyNameConstants.BindingsProperty),
                    paramVarRef));

            applyCfgMethodForStdBinding.Statements.Add(elementInit);

            CodeBinaryOperatorExpression cboe = new CodeBinaryOperatorExpression(
                elementVarRef,
                CodeBinaryOperatorType.IdentityEquality,
                CodeDomHelperObjects.NullRef);

            CodeThrowExceptionStatement ctes = new CodeThrowExceptionStatement(
                new CodeObjectCreateExpression(
                    new CodeTypeReference(typeof(ConfigurationErrorsException)),
                    new CodeMethodInvokeExpression(
                        new CodeTypeReferenceExpression(CodeDomHelperObjects.stringTypeRef),
                        MethodNameConstants.FormatMethod,
                        CodeDomHelperObjects.cultureInfoCurrent,
                        new CodePrimitiveExpression("There is no binding named {0} at {1}."),
                        paramVarRef,
                        new CodePropertyReferenceExpression(
                            sectionVarRef, PropertyNameConstants.BindingNameProperty))));
            CodeMethodInvokeExpression cmie = new CodeMethodInvokeExpression(
                elementVarRef,
                MethodNameConstants.ApplyConfigurationMethod,
                CodeDomHelperObjects.ThisRef);

            CodeStatement[]        trueStatements  = { ctes };
            CodeStatement[]        falseStatements = { new CodeExpressionStatement(cmie) };
            CodeConditionStatement ccs             = new CodeConditionStatement(cboe, trueStatements, falseStatements);

            applyCfgMethodForStdBinding.Statements.Add(ccs);

            string          indent   = "    ";
            CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();

            using (System.IO.StreamWriter sbSW = new System.IO.StreamWriter(srcFile, false))
            {
                using (IndentedTextWriter sbTW = new IndentedTextWriter(sbSW, indent))
                {
                    provider.GenerateCodeFromMember(
                        applyCfgMethodForStdBinding,
                        sbTW,
                        new CodeGeneratorOptions());
                }
            }
        }
Esempio n. 60
0
        private void _SaveSfxStub(string exeToGenerate, SelfExtractorSaveOptions options)
        {
            string nameOfIconFile      = null;
            string stubExe             = null;
            string unpackedResourceDir = null;
            string tmpDir = null;

            try
            {
                if (File.Exists(exeToGenerate))
                {
                    if (Verbose)
                    {
                        StatusMessageTextWriter.WriteLine("The existing file ({0}) will be overwritten.", exeToGenerate);
                    }
                }
                if (!exeToGenerate.EndsWith(".exe"))
                {
                    if (Verbose)
                    {
                        StatusMessageTextWriter.WriteLine("Warning: The generated self-extracting file will not have an .exe extension.");
                    }
                }

                // workitem 10553
                tmpDir  = TempFileFolder ?? Path.GetDirectoryName(exeToGenerate);
                stubExe = GenerateTempPathname(tmpDir, "exe");

                // get the Chama.Utils.Ionic.Zip assembly
                Assembly a1 = typeof(ZipFile).Assembly;

                using (var csharp = new Microsoft.CSharp.CSharpCodeProvider())
                {
                    // The following is a perfect opportunity for a linq query, but
                    // I cannot use it.  The generated SFX needs to run on .NET 2.0,
                    // and using LINQ would break that. Here's what it would look
                    // like:
                    //
                    //   var settings = (from x in SettingsList
                    //                   where x.Flavor == flavor
                    //                   select x).First();

                    ExtractorSettings settings = null;
                    foreach (var x in SettingsList)
                    {
                        if (x.Flavor == options.Flavor)
                        {
                            settings = x;
                            break;
                        }
                    }

                    // sanity check; should never happen
                    if (settings == null)
                    {
                        throw new BadStateException(String.Format("While saving a Self-Extracting Zip, Cannot find that flavor ({0})?", options.Flavor));
                    }

                    // This is the list of referenced assemblies.  Chama.Utils.Ionic.Zip is
                    // needed here.  Also if it is the winforms (gui) extractor, we
                    // need other referenced assemblies, like
                    // System.Windows.Forms.dll, etc.
                    var cp = new System.CodeDom.Compiler.CompilerParameters();
                    cp.ReferencedAssemblies.Add(a1.Location);
                    if (settings.ReferencedAssemblies != null)
                    {
                        foreach (string ra in settings.ReferencedAssemblies)
                        {
                            cp.ReferencedAssemblies.Add(ra);
                        }
                    }

                    cp.GenerateInMemory        = false;
                    cp.GenerateExecutable      = true;
                    cp.IncludeDebugInformation = false;
                    cp.CompilerOptions         = "";

                    Assembly a2 = Assembly.GetExecutingAssembly();

                    // Use this to concatenate all the source code resources into a
                    // single module.
                    var sb = new System.Text.StringBuilder();

                    // In case there are compiler errors later, we allocate a source
                    // file name now. If errors are detected, we'll spool the source
                    // code as well as the errors (in comments) into that filename,
                    // and throw an exception with the filename.  Makes it easier to
                    // diagnose.  This should be rare; most errors happen only
                    // during devlpmt of DotNetZip itself, but there are rare
                    // occasions when they occur in other cases.
                    string sourceFile = GenerateTempPathname(tmpDir, "cs");


                    // // debugging: enumerate the resources in this assembly
                    // Console.WriteLine("Resources in this assembly:");
                    // foreach (string rsrc in a2.GetManifestResourceNames())
                    //   {
                    //     Console.WriteLine(rsrc);
                    //   }
                    // Console.WriteLine();


                    // all the source code is embedded in the DLL as a zip file.
                    using (ZipFile zip = ZipFile.Read(a2.GetManifestResourceStream("Chama.Utils.Ionic.Zip.Resources.ZippedResources.zip")))
                    {
                        // // debugging: enumerate the files in the embedded zip
                        // Console.WriteLine("Entries in the embbedded zip:");
                        // foreach (ZipEntry entry in zip)
                        //   {
                        //     Console.WriteLine(entry.FileName);
                        //   }
                        // Console.WriteLine();

                        unpackedResourceDir = GenerateTempPathname(tmpDir, "tmp");

                        if (String.IsNullOrEmpty(options.IconFile))
                        {
                            // Use the ico file that is embedded into the Chama.Utils.Ionic.Zip
                            // DLL itself.  To do this we must unpack the icon to
                            // the filesystem, in order to specify it on the cmdline
                            // of csc.exe.  This method will remove the unpacked
                            // file later.
                            System.IO.Directory.CreateDirectory(unpackedResourceDir);
                            ZipEntry e = zip["zippedFile.ico"];
                            // Must not extract a readonly file - it will be impossible to
                            // delete later.
                            if ((e.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                            {
                                e.Attributes ^= FileAttributes.ReadOnly;
                            }
                            e.Extract(unpackedResourceDir);
                            nameOfIconFile      = Path.Combine(unpackedResourceDir, "zippedFile.ico");
                            cp.CompilerOptions += String.Format("/win32icon:\"{0}\"", nameOfIconFile);
                        }
                        else
                        {
                            cp.CompilerOptions += String.Format("/win32icon:\"{0}\"", options.IconFile);
                        }

                        cp.OutputAssembly = stubExe;

                        if (options.Flavor == SelfExtractorFlavor.WinFormsApplication)
                        {
                            cp.CompilerOptions += " /target:winexe";
                        }

                        if (!String.IsNullOrEmpty(options.AdditionalCompilerSwitches))
                        {
                            cp.CompilerOptions += " " + options.AdditionalCompilerSwitches;
                        }

                        if (String.IsNullOrEmpty(cp.CompilerOptions))
                        {
                            cp.CompilerOptions = null;
                        }

                        if ((settings.CopyThroughResources != null) && (settings.CopyThroughResources.Count != 0))
                        {
                            if (!Directory.Exists(unpackedResourceDir))
                            {
                                System.IO.Directory.CreateDirectory(unpackedResourceDir);
                            }
                            foreach (string re in settings.CopyThroughResources)
                            {
                                string filename = Path.Combine(unpackedResourceDir, re);

                                ExtractResourceToFile(a2, re, filename);
                                // add the file into the target assembly as an embedded resource
                                cp.EmbeddedResources.Add(filename);
                            }
                        }

                        // add the Chama.Utils.Ionic.Utils.Zip DLL as an embedded resource
                        cp.EmbeddedResources.Add(a1.Location);

                        // file header
                        sb.Append("// " + Path.GetFileName(sourceFile) + "\n")
                        .Append("// --------------------------------------------\n//\n")
                        .Append("// This SFX source file was generated by DotNetZip ")
                        .Append(ZipFile.LibraryVersion.ToString())
                        .Append("\n//         at ")
                        .Append(System.DateTime.Now.ToString("yyyy MMMM dd  HH:mm:ss"))
                        .Append("\n//\n// --------------------------------------------\n\n\n");

                        // assembly attributes
                        if (!String.IsNullOrEmpty(options.Description))
                        {
                            sb.Append("[assembly: System.Reflection.AssemblyTitle(\""
                                      + options.Description.Replace("\"", "")
                                      + "\")]\n");
                        }
                        else
                        {
                            sb.Append("[assembly: System.Reflection.AssemblyTitle(\"DotNetZip SFX Archive\")]\n");
                        }

                        if (!String.IsNullOrEmpty(options.ProductVersion))
                        {
                            sb.Append("[assembly: System.Reflection.AssemblyInformationalVersion(\""
                                      + options.ProductVersion.Replace("\"", "")
                                      + "\")]\n");
                        }

                        // workitem
                        string copyright =
                            (String.IsNullOrEmpty(options.Copyright))
                            ? "Extractor: Copyright ?Dino Chiesa 2008-2011"
                            : options.Copyright.Replace("\"", "");

                        if (!String.IsNullOrEmpty(options.ProductName))
                        {
                            sb.Append("[assembly: System.Reflection.AssemblyProduct(\"")
                            .Append(options.ProductName.Replace("\"", ""))
                            .Append("\")]\n");
                        }
                        else
                        {
                            sb.Append("[assembly: System.Reflection.AssemblyProduct(\"DotNetZip\")]\n");
                        }


                        sb.Append("[assembly: System.Reflection.AssemblyCopyright(\"" + copyright + "\")]\n")
                        .Append(String.Format("[assembly: System.Reflection.AssemblyVersion(\"{0}\")]\n", ZipFile.LibraryVersion.ToString()));
                        if (options.FileVersion != null)
                        {
                            sb.Append(String.Format("[assembly: System.Reflection.AssemblyFileVersion(\"{0}\")]\n",
                                                    options.FileVersion.ToString()));
                        }

                        sb.Append("\n\n\n");

                        // Set the default extract location if it is available
                        string extractLoc = options.DefaultExtractDirectory;
                        if (extractLoc != null)
                        {
                            // remove double-quotes and replace slash with double-slash.
                            // This, because the value is going to be embedded into a
                            // cs file as a quoted string, and it needs to be escaped.
                            extractLoc = extractLoc.Replace("\"", "").Replace("\\", "\\\\");
                        }

                        string postExCmdLine = options.PostExtractCommandLine;
                        if (postExCmdLine != null)
                        {
                            postExCmdLine = postExCmdLine.Replace("\\", "\\\\");
                            postExCmdLine = postExCmdLine.Replace("\"", "\\\"");
                        }


                        foreach (string rc in settings.ResourcesToCompile)
                        {
                            using (Stream s = zip[rc].OpenReader())
                            {
                                if (s == null)
                                {
                                    throw new ZipException(String.Format("missing resource '{0}'", rc));
                                }
                                using (StreamReader sr = new StreamReader(s))
                                {
                                    while (sr.Peek() >= 0)
                                    {
                                        string line = sr.ReadLine();
                                        if (extractLoc != null)
                                        {
                                            line = line.Replace("@@EXTRACTLOCATION", extractLoc);
                                        }

                                        line = line.Replace("@@REMOVE_AFTER_EXECUTE", options.RemoveUnpackedFilesAfterExecute.ToString());
                                        line = line.Replace("@@QUIET", options.Quiet.ToString());
                                        if (!String.IsNullOrEmpty(options.SfxExeWindowTitle))
                                        {
                                            line = line.Replace("@@SFX_EXE_WINDOW_TITLE", options.SfxExeWindowTitle);
                                        }

                                        line = line.Replace("@@EXTRACT_EXISTING_FILE", ((int)options.ExtractExistingFile).ToString());

                                        if (postExCmdLine != null)
                                        {
                                            line = line.Replace("@@POST_UNPACK_CMD_LINE", postExCmdLine);
                                        }

                                        sb.Append(line).Append("\n");
                                    }
                                }
                                sb.Append("\n\n");
                            }
                        }
                    }

                    string LiteralSource = sb.ToString();

#if DEBUGSFX
                    // for debugging only
                    string sourceModule = GenerateTempPathname(tmpDir, "cs");
                    using (StreamWriter sw = File.CreateText(sourceModule))
                    {
                        sw.Write(LiteralSource);
                    }
                    Console.WriteLine("source: {0}", sourceModule);
#endif

                    var cr = csharp.CompileAssemblyFromSource(cp, LiteralSource);


                    if (cr == null)
                    {
                        throw new SfxGenerationException("Cannot compile the extraction logic!");
                    }

                    if (Verbose)
                    {
                        foreach (string output in cr.Output)
                        {
                            StatusMessageTextWriter.WriteLine(output);
                        }
                    }

                    if (cr.Errors.Count != 0)
                    {
                        using (TextWriter tw = new StreamWriter(sourceFile))
                        {
                            // first, the source we compiled
                            tw.Write(LiteralSource);

                            // now, append the compile errors
                            tw.Write("\n\n\n// ------------------------------------------------------------------\n");
                            tw.Write("// Errors during compilation: \n//\n");
                            string p = Path.GetFileName(sourceFile);

                            foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors)
                            {
                                tw.Write(String.Format("//   {0}({1},{2}): {3} {4}: {5}\n//\n",
                                                       p,                                     // 0
                                                       error.Line,                            // 1
                                                       error.Column,                          // 2
                                                       error.IsWarning ? "Warning" : "error", // 3
                                                       error.ErrorNumber,                     // 4
                                                       error.ErrorText));                     // 5
                            }
                        }
                        throw new SfxGenerationException(String.Format("Errors compiling the extraction logic!  {0}", sourceFile));
                    }

                    OnSaveEvent(ZipProgressEventType.Saving_AfterCompileSelfExtractor);

                    // Now, copy the resulting EXE image to the _writestream.
                    // Because this stub exe is being saved first, the effect will be to
                    // concatenate the exe and the zip data together.
                    using (System.IO.Stream input = System.IO.File.OpenRead(stubExe))
                    {
                        byte[] buffer = new byte[4000];
                        int    n      = 1;
                        while (n != 0)
                        {
                            n = input.Read(buffer, 0, buffer.Length);
                            if (n != 0)
                            {
                                WriteStream.Write(buffer, 0, n);
                            }
                        }
                    }
                }

                OnSaveEvent(ZipProgressEventType.Saving_AfterSaveTempArchive);
            }
            finally
            {
                try
                {
                    if (Directory.Exists(unpackedResourceDir))
                    {
                        try { Directory.Delete(unpackedResourceDir, true); }
                        catch (System.IO.IOException exc1)
                        {
                            StatusMessageTextWriter.WriteLine("Warning: Exception: {0}", exc1);
                        }
                    }
                    if (File.Exists(stubExe))
                    {
                        try { File.Delete(stubExe); }
                        catch (System.IO.IOException exc1)
                        {
                            StatusMessageTextWriter.WriteLine("Warning: Exception: {0}", exc1);
                        }
                    }
                }
                catch (System.IO.IOException) { }
            }

            return;
        }