示例#1
0
#pragma warning disable CS0419, CS1574
        /// <summary>
        ///     Starts the dynamic assembly builder and returns an instance of <see cref="IDynamicAssemblyBuilder" />.
        ///     Use the value of <see cref="IGlobalsCore.CurrentInProgressDynamicAssemblyBuilder" />
        ///     anywhere in code to add C# files and referenced assemblies to the assembly being generated.
        ///     Example usage of this method is as follows:
        ///     <para />
        ///     using(var assemblyBuilder = <see cref="StartDynamicAssemblyBuilder" />("c:\DynamicallyGeneratedAssembly1.dll"))
        ///     <para />
        ///     {
        ///     <para />
        ///     assemblyBuilder.<see cref="IDynamicAssemblyBuilder.AddReferencedAssembly" />(typeof(
        ///     <see cref="ITypeBasedSimpleSerializerAggregator" />));
        ///     <para />
        ///     assemblyBuilder.AddReferencedAssembly("MyReferencedAssembly1.dll");
        ///     <para />
        ///     AddCSharpFile1();
        ///     <para />
        ///     }
        ///     <para />
        ///     public void AddCSharpFile1()
        ///     <para />
        ///     {
        ///     <para />
        ///     var assemblyBuilder = <see cref="GlobalsCoreAmbientContext.Context.CurrentInProgressDynamicAssemblyBuilder" />;
        ///     <para />
        ///     var cSharpFile = null;
        ///     <para />
        ///     // generate C# file contents in cSharpFile
        ///     <para />
        ///     // ...
        ///     <para />
        ///     assemblyBuilder.AddCSharpFile(cSharpFile);
        ///     <para />
        ///     }
        ///     <para />
        /// </summary>
        /// <param name="dynamicAssemblyPath">The dynamic assembly path, where dynamically generated assembly will be saved.</param>
        /// <param name="onDynamicAssemblyEmitComplete">
        ///     Delegate <see cref="OnDynamicAssemblyEmitComplete" /> that will be called,
        ///     when the dynamic assembly generation is complete.
        /// </param>
        /// <param name="addAllLoadedAssembliesAsReferences">
        ///     if set to <c>true</c> all assemblies loaded into current application
        ///     domain will be automatically added as referenced assemblies to the dynamically generated assembly.
        /// </param>
        /// <param name="referencedAssemblyPaths">
        ///     Assembly paths for assemblies that will be added as references to generated
        ///     assembly.
        /// </param>
        /// <returns>
        ///     Returns an instance of <see cref="IDynamicAssemblyBuilder" />.
        /// </returns>
        /// <exception cref="System.Exception"></exception>
        public virtual IDynamicAssemblyBuilder StartDynamicAssemblyBuilder(string dynamicAssemblyPath,
                                                                           Delegates.OnDynamicAssemblyEmitComplete onDynamicAssemblyEmitComplete,
                                                                           bool addAllLoadedAssembliesAsReferences,
                                                                           params string[] referencedAssemblyPaths)
        {
            lock (_lockObjectDynamicAssemblyBuilder)
            {
                if (CurrentInProgressDynamicAssemblyBuilder != null)
                {
                    LogHelper.Context.Log.ErrorFormat("Trying to start a compilation while {0}.CurrentInProgressCSharpCompilation is not null.",
                                                      typeof(GlobalsCore).FullName);
                    throw new Exception();
                }

                CurrentInProgressDynamicAssemblyBuilder = _dynamicAssemblyBuilderFactory.CreateDynamicAssemblyBuilder(dynamicAssemblyPath,
                                                                                                                      (assemblyPath, success, emitResult) =>
                {
                    lock (_lockObjectDynamicAssemblyBuilder)
                    {
                        try
                        {
                            onDynamicAssemblyEmitComplete?.Invoke(assemblyPath, success, emitResult);
                        }
                        finally
                        {
                            CurrentInProgressDynamicAssemblyBuilder = null;
                        }
                    }
                });

                if (addAllLoadedAssembliesAsReferences)
                {
                    foreach (var assembly in GlobalsCoreAmbientContext.Context.GetAllLoadedAssemblies())
                    {
                        CurrentInProgressDynamicAssemblyBuilder.AddReferencedAssembly(assembly.Location);
                    }
                }

                if (referencedAssemblyPaths != null)
                {
                    foreach (var referencedAssemblyPath in referencedAssemblyPaths)
                    {
                        CurrentInProgressDynamicAssemblyBuilder.AddReferencedAssembly(referencedAssemblyPath);
                    }
                }

                return(CurrentInProgressDynamicAssemblyBuilder);
            }
        }
示例#2
0
 /// <summary>
 ///     Creates the dynamic assembly builder.
 /// </summary>
 /// <param name="dynamicAssemblyPath">The dynamic assembly path.</param>
 /// <param name="onDynamicAssemblyEmitComplete">The on dynamic assembly emit complete.</param>
 /// <returns></returns>
 public IDynamicAssemblyBuilder CreateDynamicAssemblyBuilder(string dynamicAssemblyPath,
                                                             Delegates.OnDynamicAssemblyEmitComplete onDynamicAssemblyEmitComplete)
 {
     return(new DynamicAssemblyBuilder(dynamicAssemblyPath, onDynamicAssemblyEmitComplete));
 }