예제 #1
0
        /// <summary>
        /// Creates the dynamic assembly.
        /// </summary>
        /// <param name="provider">The provider.</param>
        /// <param name="referencedAssemblies">The referenced assemblies.</param>
        /// <param name="namespace">The namespace.</param>
        /// <param name="usingNameSpaces">The using nameSpaces.</param>
        /// <param name="classCodesToCompile">The class codes to compile.</param>
        /// <returns>Assembly.</returns>
        /// <exception cref="OperationFailureException">CompileAssemblyFromSource;null</exception>
        public SandboxAssembly CreateDynamicAssembly(CodeDomProvider provider, List<string> referencedAssemblies, string @namespace, IEnumerable<string> usingNameSpaces, string classCodesToCompile)
        {
            try
            {
                provider.CheckNullObject("provider");
                classCodesToCompile.CheckEmptyString("classCodesToCompile");

                @namespace = @namespace.SafeToString("Beyova.DynamicCompile.Sandbox");

                var objCompilerParameters = new CompilerParameters
                {
                    GenerateExecutable = false,
                    GenerateInMemory = true
                };

                // Prepare references.

                var references = GetCommonAssemblyNameList();

                if (referencedAssemblies.HasItem())
                {
                    references.AddRange(referencedAssemblies);
                }

                objCompilerParameters.ReferencedAssemblies.AddRange(references.ToArray());

                // Prepare references done.

                // Prepare namespace

                var nameSpaces = GetCommonNamespaces();

                if (usingNameSpaces.HasItem())
                {
                    nameSpaces.AddRange(usingNameSpaces);
                }

                // Prepare namespace done;

                StringBuilder builder = new StringBuilder(512);
                foreach (var one in nameSpaces)
                {
                    builder.AppendLineWithFormat("using {0};", one);
                }

                builder.AppendLineWithFormat("namespace {0}", @namespace);
                //Namespace start
                builder.AppendLine("{");
                builder.AppendLine(classCodesToCompile);

                //End of namespace
                builder.Append("}");

                var compilerResult = provider.CompileAssemblyFromSource(objCompilerParameters, classCodesToCompile);

                if (compilerResult.Errors.HasErrors)
                {
                    List<dynamic> errors = new List<dynamic>();
                    foreach (CompilerError one in compilerResult.Errors)
                    {
                        errors.Add(new
                        {
                            one.ErrorText,
                            one.ErrorNumber,
                            one.Line
                        });
                    }

                    throw new OperationFailureException("CompileAssemblyFromSource", null, errors);
                }

                return new SandboxAssembly(compilerResult.CompiledAssembly, @namespace);
            }
            catch (Exception ex)
            {
                throw ex.Handle("CreateDynamicAssembly");
            }
        }