public static string Build(IEnumerable <AssemblyDefinition> assemblys, string outDirectory, string bridgeDllPath, string libWhite, string libBlack) { TypeDefinitionBuilder builder = new TypeDefinitionBuilder(libWhite, libBlack); List <CodeCompileUnit> units = new List <CodeCompileUnit>(); foreach (var assemblyDefinition in assemblys) { CodeCompileUnit unit = new CodeCompileUnit(); Dictionary <string, CodeNamespace> namespaces = new Dictionary <string, CodeNamespace>(); foreach (var module in assemblyDefinition.Modules) { foreach (var type in module.Types) { if (builder.IsEnableType(type)) { CodeTypeDeclaration codeTypeDeclaration = builder.Build(type); CodeNamespace codeNamespace = namespaces.GetOrDefault(type.Namespace); if (codeNamespace == null) { codeNamespace = new CodeNamespace(type.Namespace); namespaces.Add(codeNamespace.Name, codeNamespace); } codeNamespace.Types.Add(codeTypeDeclaration); } } } unit.Namespaces.AddRange(namespaces.Values.ToArray()); units.Add(unit); } CompilerParameters cp = new CompilerParameters(); cp.CoreAssemblyFileName = bridgeDllPath; cp.GenerateExecutable = false; cp.GenerateInMemory = false; cp.TreatWarningsAsErrors = false; cp.TempFiles.KeepFiles = true; cp.OutputAssembly = Path.Combine(outDirectory, kWrapDllName); cp.ReferencedAssemblies.Add(bridgeDllPath); CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerResults cr = provider.CompileAssemblyFromSource(cp, units.Select(i => i.Compile()).ToArray()); if (cr.Errors.Count > 0) { StringBuilder sb = new StringBuilder(); foreach (CompilerError ce in cr.Errors) { sb.AppendFormat(" {0}", ce.ToString()); sb.AppendLine(); } throw new System.Exception(sb.ToString()); } return(cr.PathToAssembly); }
public static string Build(IEnumerable<AssemblyDefinition> assemblys, string outDirectory, string bridgeDllPath, string libWhite, string libBlack) { TypeDefinitionBuilder builder = new TypeDefinitionBuilder(libWhite, libBlack); List<CodeCompileUnit> units = new List<CodeCompileUnit>(); foreach(var assemblyDefinition in assemblys) { CodeCompileUnit unit = new CodeCompileUnit(); Dictionary<string, CodeNamespace> namespaces = new Dictionary<string, CodeNamespace>(); foreach(var module in assemblyDefinition.Modules) { foreach(var type in module.Types) { if(builder.IsEnableType(type)) { CodeTypeDeclaration codeTypeDeclaration = builder.Build(type); CodeNamespace codeNamespace = namespaces.GetOrDefault(type.Namespace); if(codeNamespace == null) { codeNamespace = new CodeNamespace(type.Namespace); namespaces.Add(codeNamespace.Name, codeNamespace); } codeNamespace.Types.Add(codeTypeDeclaration); } } } unit.Namespaces.AddRange(namespaces.Values.ToArray()); units.Add(unit); } CompilerParameters cp = new CompilerParameters(); cp.CoreAssemblyFileName = bridgeDllPath; cp.GenerateExecutable = false; cp.GenerateInMemory = false; cp.TreatWarningsAsErrors = false; cp.TempFiles.KeepFiles = true; cp.OutputAssembly = Path.Combine(outDirectory, kWrapDllName); cp.ReferencedAssemblies.Add(bridgeDllPath); CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerResults cr = provider.CompileAssemblyFromSource(cp, units.Select(i => i.Compile()).ToArray()); if(cr.Errors.Count > 0) { StringBuilder sb = new StringBuilder(); foreach(CompilerError ce in cr.Errors) { sb.AppendFormat(" {0}", ce.ToString()); sb.AppendLine(); } throw new System.Exception(sb.ToString()); } return cr.PathToAssembly; }