Example #1
0
        public string GenerateCode(IOrganizationService service, Delegate delegateInstance, COMPILE_ACTION action, string exeFileName, string code, string usingList, ProgressIndicatorDelegate startProgress, ProgressIndicatorDelegate stopProgress)
        {
            string result     = null;
            var    provider   = new Microsoft.CSharp.CSharpCodeProvider();
            var    parameters = new System.CodeDom.Compiler.CompilerParameters();

            parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
            parameters.ReferencedAssemblies.Add("System.Drawing.dll");
            parameters.ReferencedAssemblies.Add("System.Data.dll");
            parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            parameters.ReferencedAssemblies.Add("System.Xml.dll");
            parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
            parameters.ReferencedAssemblies.Add("System.Activities.dll");
            parameters.ReferencedAssemblies.Add("Microsoft.IdentityModel.dll");
            parameters.ReferencedAssemblies.Add("System.ServiceModel.dll");
            parameters.ReferencedAssemblies.Add("System.Runtime.Serialization.dll");
            parameters.ReferencedAssemblies.Add("Microsoft.Crm.Sdk.Proxy.dll");
            parameters.ReferencedAssemblies.Add("System.Configuration.dll");
            parameters.ReferencedAssemblies.Add("Microsoft.Xrm.Sdk.dll");
            parameters.ReferencedAssemblies.Add("Microsoft.Xrm.Tooling.Connector.dll");


            // True - memory generation, false - external file generation
            parameters.GenerateInMemory = action == COMPILE_ACTION.RUN_NOW;
            // True - exe file generation, false - dll file generation
            parameters.GenerateExecutable = action == COMPILE_ACTION.MAKE_EXE;
            if (action != COMPILE_ACTION.RUN_NOW)
            {
                parameters.OutputAssembly = exeFileName;
            }

            string snkFileName = null;
            string exeSource   = code;

            if (action != COMPILE_ACTION.COMPILE_DLL)
            {
                exeSource = BaseCode.Replace("#CODE#", code).Replace("#USING#", usingList + HelperCode);
            }
            else
            {
                //need a key file
                snkFileName = System.IO.Path.GetDirectoryName(exeFileName) + "\\codenow.snk";
                parameters.CompilerOptions = "/keyfile:\"" + snkFileName + "\"";
                System.IO.File.WriteAllBytes(snkFileName, CodenowKey);
            }
            System.CodeDom.Compiler.CompilerResults results = null;
            try
            {
                results = provider.CompileAssemblyFromSource(parameters, exeSource);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (snkFileName != null)
                {
                    System.IO.File.Delete(snkFileName);
                }
            }


            if (results.Errors.HasErrors)
            {
                StringBuilder sb = new StringBuilder();

                foreach (System.CodeDom.Compiler.CompilerError error in results.Errors)
                {
                    result += (String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText)) + System.Environment.NewLine;
                }
            }
            else if (action == COMPILE_ACTION.RUN_NOW)
            {
                var      th           = new System.Threading.Thread(StartRunCodeThread);
                Object[] threadParams = new Object[5];
                threadParams[0] = results;
                threadParams[1] = delegateInstance;
                threadParams[2] = service;
                threadParams[3] = startProgress;
                threadParams[4] = stopProgress;
                th.Start(threadParams);
            }
            else
            {
                result += "Done!";
            }
            return(result);
        }