#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); } }
/// <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)); }