public void Can_sign_using_keycontainer() { var keyContainerName = Guid.NewGuid().ToString(); CspContainerUtils.ImportBlob(true, keyContainerName, KeyNumber.Signature, File.ReadAllBytes(TestFiles.TestSnk)); try { using (var outputFile = TempFile.WithExtension(".dll")) { var ilMerge = new ILMerge { KeyContainer = keyContainerName, OutputFile = outputFile }; ilMerge.SetUpInputAssemblyForTest(Assembly.GetExecutingAssembly()); ilMerge.Merge(); Assert.That( AssemblyName.GetAssemblyName(outputFile).GetPublicKey(), Is.EqualTo(new StrongNameKeyPair(File.ReadAllBytes(TestFiles.TestSnk)).PublicKey)); } } finally { CspContainerUtils.Delete(true, keyContainerName, KeyNumber.Signature); } }
public void Single_input() { var ilMerge = new ILMerge(); ilMerge.SetUpInputAssemblyForTest(Assembly.GetExecutingAssembly()); ilMerge.MergeToTempFileForTest(".dll"); }
static int Main(string[] args) { try { var merge = new ILMerge { OutputFile = "RavenDb.exe", TargetKind = ILMerge.Kind.SameAsPrimaryAssembly, Version = new Version(4, 0) }; merge.SetInputAssemblies( new[] { @"Raven.Server.exe", @"Raven.Database.dll", @"Esent.Interop.dll", @"ICSharpCode.NRefactory.dll", @"Lucene.Net.dll", @"log4net.dll", @"Newtonsoft.Json.dll", }); merge.SetTargetPlatform("4", Path.GetDirectoryName(typeof(object).Assembly.Location)); merge.Merge(); return 0; } catch (Exception e) { Console.WriteLine(e); return -1; } }
public void Setup() { task = new ILMerge(); task.ToolPath = Path.Combine(TaskUtility.GetProjectRootDirectory(true), @"Source\packages\ilmerge.2.12.0803\"); task.BuildEngine = new MockBuild(); task.InputAssemblies = this.inputAssemblies; }
public static void MergeToTempFileForTest(this ILMerge ilMerge, string outputExtension) { using (var outputFile = TempFile.WithExtension(outputExtension)) { ilMerge.OutputFile = outputFile; ilMerge.Merge(); } }
/// <summary>The created assembly has the same 'kind' as the primary assembly.</summary> /// <param name="assemblyFileNames">The first assembly is the primary assembly.</param> public static void MergeAssemblies(String outputFileName, params String[] assemblyFileNames) { ILMerge merge = new ILMerge(); merge.OutputFile = outputFileName; merge.TargetKind = ILMerge.Kind.SameAsPrimaryAssembly; merge.SetInputAssemblies(assemblyFileNames); merge.Merge(); }
public void LinkExecutable() { ILMerge merger = new ILMerge(); merger.OutputFile = _outputFile; _inputAssemblies.Insert(0, _inputFile); merger.SetInputAssemblies((string[])_inputAssemblies.ToArray()); merger.SetSearchDirectories(new string[] { "..\\runtime", "..\\library" }); merger.TargetKind = ILMerge.Kind.Exe; merger.Merge(); }
public void LinkLibrary() { ILMerge merger = new ILMerge(); merger.OutputFile = _outputFile; _inputAssemblies.Insert(0, _inputFile); merger.SetInputAssemblies((string[])_inputAssemblies.ToArray()); merger.SetSearchDirectories(new string[] { "..\\runtime", "..\\library" }); merger.TargetKind = ILMerge.Kind.Dll; merger.Merge(); }
private static void Merge(string outputFile, string[] inputAssemblies) { var merge = new ILMerge { OutputFile = outputFile, TargetKind = ILMerge.Kind.SameAsPrimaryAssembly, Version = new Version(4, 0), }; merge.SetInputAssemblies(inputAssemblies); merge.SetTargetPlatform("4", Path.GetDirectoryName(typeof(object).Assembly.Location)); merge.Merge(); }
public void DuplicateTypeCollision() { if (!this.isILMergeAvailable) { Assert.Ignore(@"ILMerge.exe not available"); } ILMerge task = new ILMerge(); task.BuildEngine = new MockBuild(); task.InputAssemblies = this.inputAssemblies; task.OutputFile = new TaskItem(Path.Combine(this.testDirectory, @"merged.dll")); Assert.IsFalse(task.Execute(), @"Task succeeded dispite of duplicate type names"); }
public void Can_sign_using_keyfile() { using (var outputFile = TempFile.WithExtension(".dll")) { var ilMerge = new ILMerge { KeyFile = TestFiles.TestSnk, OutputFile = outputFile }; ilMerge.SetUpInputAssemblyForTest(Assembly.GetExecutingAssembly()); ilMerge.Merge(); Assert.That( AssemblyName.GetAssemblyName(outputFile).GetPublicKey(), Is.EqualTo(new StrongNameKeyPair(File.ReadAllBytes(TestFiles.TestSnk)).PublicKey)); } }
public void DuplicateTypeCollision() { if (!ilMergeAvailable) { Assert.Ignore(@"ILMerge.exe not available"); } ILMerge task = new ILMerge(); task.BuildEngine = new MockBuild(); task.InputAssemblies = inputAssemblies; task.OutputFile = new TaskItem(Path.Combine(testDirectory, @"merged.dll")); Assert.IsFalse(task.Execute(), @"Task succeeded dispite of duplicate type names"); }
public void Sign_with_keyfile_should_not_throw_error() { using (var outputFile = TempFile.WithExtension(".dll")) using (var logFile = TempFile.WithExtension(".log")) { var ilMerge = new ILMerge { KeyFile = TestFiles.TestSnk, OutputFile = outputFile, LogFile = logFile }; ilMerge.SetUpInputAssemblyForTest(Assembly.GetExecutingAssembly()); ilMerge.Merge(); var errorLines = File.ReadLines(logFile).Where(line => line.StartsWith("ILMerge error:", StringComparison.OrdinalIgnoreCase)); Assert.That(errorLines, Is.Empty); } }
public void DuplicateTypeAllowed() { if (!this.isILMergeAvailable) { Assert.Ignore(@"ILMerge.exe not available"); } ILMerge task = new ILMerge(); task.BuildEngine = new MockBuild(); task.InputAssemblies = this.inputAssemblies; task.OutputFile = new TaskItem(Path.Combine(this.testDirectory, @"merged1.dll")); task.AllowDuplicateTypes = TaskUtility.StringArrayToItemArray(@"ClassAB", "ClassBA"); task.XmlDocumentation = true; Assert.IsTrue(task.Execute(), @"Task failed"); this.AssertResults(task, PublicCount, VersionA); }
public void DuplicateTypeAllowed() { if (!ilMergeAvailable) { Assert.Ignore(@"ILMerge.exe not available"); } ILMerge task = new ILMerge(); task.BuildEngine = new MockBuild(); task.InputAssemblies = inputAssemblies; task.OutputFile = new TaskItem(Path.Combine(testDirectory, @"merged1.dll")); task.AllowDuplicateTypes = TaskUtility.StringArrayToItemArray(@"ClassAB"); task.XmlDocumentation = true; Assert.IsTrue(task.Execute(), @"Task failed"); AssertResults(task, PUBLIC_COUNT, VERSION_A); }
private static void Main(string[] args) { try { var commandLineProcessor = new CommandLineProcessor(); var options = commandLineProcessor.Process(args); var semanticVersionAnalyzer = new SemanticVersionAnalyzer(); var result = semanticVersionAnalyzer.Analyze(options.PreviousAssembly, options.CurrentAssembly, options.ProposedVersionNumber); if (result.BreakingChangesDetected) { var dynamicAssembly = new CodeGenerator().GenerateVersionDetailsDynamicAssembly(options.CurrentAssembly, result.VersionNumber, result.VersionNumber, result.VersionNumber); var ilMerge = new ILMerge { TargetKind = ILMerge.Kind.Dll, AttributeFile = dynamicAssembly, OutputFile = options.OutputFile }; ilMerge.SetInputAssemblies(new[] { options.CurrentAssembly }); ilMerge.Merge(); Console.WriteLine("##teamcity[buildNumber '" + result.VersionNumber + "']"); } } catch (Exception exception) { var aggregateException = exception as AggregateException; if (aggregateException != null) { foreach (var e in aggregateException.InnerExceptions) { Console.WriteLine(e.Message); } } else { Console.WriteLine(exception.Message); } } }
private static void Main(string[] args) { try { var commandLineProcessor = new CommandLineProcessor(); var options = commandLineProcessor.Process(args); var semanticVersionAnalyzer = new SemanticVersionAnalyzer(); var result = semanticVersionAnalyzer.Analyze(options.PreviousAssembly, options.CurrentAssembly, options.ProposedVersionNumber); if (result.BreakingChangesDetected) { var dynamicAssembly = new CodeGenerator().GenerateVersionDetailsDynamicAssembly(options.CurrentAssembly, result.VersionNumber, result.VersionNumber, result.VersionNumber); var ilMerge = new ILMerge { TargetKind = ILMerge.Kind.Dll, AttributeFile = dynamicAssembly, OutputFile = options.OutputFile }; ilMerge.SetInputAssemblies(new[] { options.CurrentAssembly } ); ilMerge.Merge(); Console.WriteLine("##teamcity[buildNumber '" + result.VersionNumber + "']"); } } catch (Exception exception) { var aggregateException = exception as AggregateException; if (aggregateException != null) { foreach (var e in aggregateException.InnerExceptions) { Console.WriteLine(e.Message); } } else { Console.WriteLine(exception.Message); } } }
protected virtual void MergeStaticProxyFactoryWithProxies(Assembly staticProxyAssembly, Assembly proxyAssembly, Assembly[] referenceAssemblies, string outputPath) { ILMerge merger = new ILMerge(); List <string> searchDirectories = new List <string>(referenceAssemblies.Length); foreach (Assembly referenceAssembly in referenceAssemblies) { string searchDirectory = Path.GetDirectoryName(referenceAssembly.Location); if (!searchDirectories.Contains(searchDirectory)) { searchDirectories.Add(searchDirectory); } } merger.SetSearchDirectories(searchDirectories.ToArray()); merger.SetInputAssemblies(new string[] { staticProxyAssembly.Location, proxyAssembly.Location }); merger.OutputFile = outputPath; merger.Merge(); }
public void Can_sign_using_keyfile() { // ARRANGE var outputFile = Path.Combine(TestContext.DeploymentDirectory, Path.ChangeExtension(Path.GetRandomFileName(), Extension)); var ilMerge = new ILMerge { KeyFile = "test.snk", OutputFile = outputFile }; ilMerge.SetUpInputAssemblyForTest(Assembly.GetExecutingAssembly()); // ACT ilMerge.Merge(); // ASSERT var expectedKeyBytes = new StrongNameKeyPair(File.ReadAllBytes(TestSnk)).PublicKey; var outputFileKeyBytes = AssemblyName.GetAssemblyName(outputFile).GetPublicKey(); CollectionAssert.AreEqual(expectedKeyBytes, outputFileKeyBytes, "Expected PublicKey bytes do not match-up to the generated assembly PublicKey bytes"); }
public void Bad_keyfile_gives_diagnostic_warning() { using (var logFile = new TempFile()) using (var outputFile = TempFile.WithExtension(".dll")) { var ilMerge = new ILMerge { KeyFile = TestFiles.TestPfx, OutputFile = outputFile, LogFile = logFile }; ilMerge.SetUpInputAssemblyForTest(Assembly.GetExecutingAssembly()); ilMerge.Merge(); var logText = File.ReadAllText(logFile); Assert.That(logText, Contains.Substring("Unable to obtain public key for StrongNameKeyPair.")); Assert.That(logText, Contains.Substring("PFX")); Assert.That(logText, Contains.Substring("key container")); } }
public void SignedMergedAssembly() { if (!this.isILMergeAvailable) { Assert.Ignore(@"ILMerge.exe not available"); } ILMerge task = new ILMerge(); task.BuildEngine = new MockBuild(); task.InputAssemblies = this.inputAssemblies; task.OutputFile = new TaskItem(Path.Combine(this.testDirectory, @"merged4.dll")); task.AllowDuplicateTypes = TaskUtility.StringArrayToItemArray(@"ClassAB"); task.DebugInfo = false; task.XmlDocumentation = false; task.KeyFile = new TaskItem(this.keyFile); Assert.IsTrue(task.Execute(), @"Task failed"); this.AssertResults(task, PublicCount, VersionA); }
private void AssertResults(ILMerge task, int publicTypeCount, string version) { MessageImportance imp = MessageImportance.Low; Assert.IsTrue(File.Exists(task.OutputFile.ItemSpec), @"No merged assembly"); string pdbFile = Path.ChangeExtension(task.OutputFile.ItemSpec, "pdb"); Assert.AreEqual(task.DebugInfo, File.Exists(pdbFile), @"No debug file"); string xmlFile = Path.ChangeExtension(task.OutputFile.ItemSpec, @"xml"); Assert.AreEqual(task.XmlDocumentation, File.Exists(xmlFile), @"No xml documentation file"); Assembly merge = Assembly.LoadFile(task.OutputFile.ItemSpec); task.Log.LogMessage(imp, "Merged assembly: {0}", merge.FullName); Type[] types = merge.GetExportedTypes(); foreach (Type type in types) { task.Log.LogMessage(imp, "Type: {0}", type.Name); task.Log.LogMessage(imp, " Attributes: {0}", type.Attributes.ToString()); } Assert.AreEqual(publicTypeCount, types.Length, @"Wrong number of public types"); AssemblyName assName = new AssemblyName(merge.FullName); task.Log.LogMessage(imp, "Version: {0}", assName.Version.ToString()); Assert.AreEqual(version, assName.Version.ToString(), @"Wrong version"); byte[] publicKeyToken = assName.GetPublicKeyToken(); if (task.KeyFile == null) { Assert.AreEqual(0, publicKeyToken.Length, @"Merged assembly expected to be unsigned"); } else { Assert.AreNotEqual(0, publicKeyToken, @"Merged assembly expected to be signed"); } }
private static void CreateSignedParser(string gherkinParserFullPath, Version version, string keyFullPath, string outputFileFullPath) { Console.WriteLine("Generating signed parser..."); ILMerge ilMerge = new ILMerge(); ilMerge.KeyFile = keyFullPath; ilMerge.Version = version; string simpleJsonPath = Path.Combine(Path.GetDirectoryName(gherkinParserFullPath), "com.googlecode.json-simple-json-simple.dll"); string base46Path = Path.Combine(Path.GetDirectoryName(gherkinParserFullPath), "net.iharder-base64.dll"); ilMerge.SetInputAssemblies(new[] { gherkinParserFullPath, simpleJsonPath, base46Path }); ilMerge.OutputFile = outputFileFullPath; ilMerge.TargetKind = ILMerge.Kind.Dll; ilMerge.Log = true; ilMerge.Merge(); Console.WriteLine(); }
public void VersionedMergedAssembly() { if (!ilMergeAvailable) { Assert.Ignore(@"ILMerge.exe not available"); } ILMerge task = new ILMerge(); task.BuildEngine = new MockBuild(); task.InputAssemblies = inputAssemblies; task.OutputFile = new TaskItem(Path.Combine(testDirectory, @"merged5.dll")); task.AllowDuplicateTypes = TaskUtility.StringArrayToItemArray(@"ClassAB"); task.DebugInfo = false; task.XmlDocumentation = false; task.KeyFile = new TaskItem(keyFile); string version = @"5.6.7.8"; task.Version = version; Assert.IsTrue(task.Execute(), @"Task failed"); AssertResults(task, PUBLIC_COUNT, version); }
protected virtual void MergeStaticProxyFactoryWithProxies(Assembly staticProxyAssembly, Assembly proxyAssembly, Assembly[] referenceAssemblies, string outputPath) { ILMerge merger = new ILMerge(); List<string> searchDirectories = new List<string>(referenceAssemblies.Length); foreach(Assembly referenceAssembly in referenceAssemblies ) { string searchDirectory = Path.GetDirectoryName(referenceAssembly.Location); if (!searchDirectories.Contains(searchDirectory)) { searchDirectories.Add(searchDirectory); } } merger.SetSearchDirectories(searchDirectories.ToArray()); merger.SetInputAssemblies(new string[] { staticProxyAssembly.Location, proxyAssembly.Location }); merger.OutputFile = outputPath; merger.Merge(); }
/// <summary> /// Performs packing. /// </summary> public void Run() { // Steps // 1) Mono.Cecil: Determine assembly dependencies // 2) ILMerge: Merge exe into a single assembly // 3) Mono.Linker var includeMergeListRegex = new string[] { @"SharpDX\..*" }; // Step 1 : Mono.Cecil: Determine assembly dependencies var assembly = AssemblyDefinition.ReadAssembly(MainAssembly); var corlib = (AssemblyNameReference)assembly.MainModule.TypeSystem.Corlib; bool isNet40 = corlib.Version.Major == 4; var paths = new List<string>(); var fromDirectory = Path.GetDirectoryName(assembly.MainModule.FullyQualifiedName); // Load SharpDX assemblies AddAssemblies(assembly, paths, fromDirectory, includeMergeListRegex); // Load assemblies to link foreach (var assemblyToLinkName in AssembliesToLink) { var assemblyToLink = AssemblyDefinition.ReadAssembly(assemblyToLinkName); paths.Add(assemblyToLink.MainModule.FullyQualifiedName); } // Step 2: ILMerge: Merge exe into a single assembly var merge = new ILMerge(); String[] files = paths.ToArray(); if (!Directory.Exists(OutputDirectory)) Directory.CreateDirectory(OutputDirectory); //Here we get the first file name (which was the .exe file) and use that // as the output String strOutputFile = System.IO.Path.GetFileName(files[0]); merge.OutputFile = OutputDirectory + "\\" + strOutputFile; merge.SetInputAssemblies(files); merge.DebugInfo = false; merge.CopyAttributes = true; merge.AllowMultipleAssemblyLevelAttributes = true; merge.XmlDocumentation = false; // Special case for v4 framework // See http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx if (isNet40) { // Retrieve the install root path for the framework string installRoot = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\.NetFramework", false).GetValue("InstallRoot").ToString(); var directorties = Directory.GetDirectories(installRoot, "v4.*"); if (directorties.Length == 0) UsageError(string.Format(System.Globalization.CultureInfo.InvariantCulture, "Cannot found any .Net 4.0 directory from [{0}] ", installRoot)); merge.SetTargetPlatform("v4", directorties[0]); } merge.Merge(); // Step 3: Mono.Linker if (!NoLinker) { var pipeline = GetStandardPipeline(); var context = new LinkContext(pipeline) {CoreAction = AssemblyAction.Skip, OutputDirectory = OutputDirectory}; context.OutputDirectory = OutputDirectory; var mainAssemblyDirectory = new DirectoryInfo(Path.GetDirectoryName(Path.GetFullPath(MainAssembly))); context.Resolver.AddSearchDirectory(mainAssemblyDirectory.FullName); // Load assembly merged previously by ILMerge var mergedAssemblyDefinition = context.Resolve(merge.OutputFile); // Create Mono.Linker default pipeline pipeline = GetStandardPipeline(); pipeline.PrependStep(new ResolveFromAssemblyStep(mergedAssemblyDefinition)); // Add custom step for ComObject constructors pipeline.AddStepBefore(typeof (SweepStep), new ComObjectStep()); pipeline.Process(context); } Console.WriteLine("Assembly successfully packed to [{0}]", merge.OutputFile); }
public void ILMerge(Action<IILMerge> args) { var implementation = new ILMerge(); args(implementation); implementation.InternalExecute(); }
static void Main(string[] args) { #if !DEBUG Version networkCommsVersion = new Version(Assembly.ReflectionOnlyLoad("NetworkCommsDotNet").FullName. Split(','). Where(s => s.Split('=').Length == 2). ToDictionary(s => s.Split('=')[0].Trim(), s => s.Split('=')[1].Trim())["Version"]); string targetPlatform = "v2"; string msCoreLibDirectory = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727"; bool coreBuildEnabled = false; bool completeBuildEnabled = true; #region Merge Core if (coreBuildEnabled) { Directory.CreateDirectory("MergedCore"); File.Delete(@"MergedCore\MergeLog.txt"); ILMerge coreMerge = new ILMerge(); List <string> coreAssembles = new List <string>(); coreAssembles.Add("NetworkCommsDotNet.dll"); coreAssembles.Add("protobuf-net.dll"); coreAssembles.Add("ProtobufSerializer.dll"); coreMerge.SetInputAssemblies(coreAssembles.ToArray()); coreMerge.Version = networkCommsVersion; coreMerge.TargetKind = ILMerge.Kind.Dll; coreMerge.SetTargetPlatform(targetPlatform, msCoreLibDirectory); coreMerge.XmlDocumentation = true; coreMerge.KeyFile = "networkcomms.net.snk"; coreMerge.OutputFile = @"MergedCore\NetworkCommsDotNetCore.dll"; coreMerge.Log = true; coreMerge.LogFile = @"MergedCore\MergeLog.txt"; coreMerge.Merge(); } #endregion #region Merge Complete if (completeBuildEnabled) { Directory.CreateDirectory("MergedComplete"); File.Delete(@"MergedComplete\MergeLog.txt"); ILMerge completeMerge = new ILMerge(); List <string> completeAssembles = new List <string>(); completeAssembles.Add("NetworkCommsDotNet.dll"); completeAssembles.Add("protobuf-net.dll"); completeAssembles.Add("ProtobufSerializer.dll"); completeAssembles.Add("ICSharpCode.SharpZipLib.dll"); completeAssembles.Add("SharpZipLibCompressor.dll"); //completeAssembles.Add("QuickLZCompressor.dll"); completeMerge.SetInputAssemblies(completeAssembles.ToArray()); completeMerge.Version = networkCommsVersion; completeMerge.TargetKind = ILMerge.Kind.Dll; completeMerge.SetTargetPlatform(targetPlatform, msCoreLibDirectory); completeMerge.XmlDocumentation = true; completeMerge.KeyFile = "networkcomms.net.snk"; completeMerge.OutputFile = @"MergedComplete\NetworkCommsDotNetComplete.dll"; completeMerge.Log = true; completeMerge.LogFile = @"MergedComplete\MergeLog.txt"; completeMerge.Merge(); } #endregion #endif }
protected override void ExecuteTask() { ILMerge = new ILMerge(); ILMerge.AttributeFile = m_attributeFile; ILMerge.Closed = m_closed; ILMerge.CopyAttributes = m_copyAttributes; ILMerge.DebugInfo = m_debugInfo; ILMerge.ExcludeFile = m_excludeFile; ILMerge.Internalize = m_internalize; ILMerge.LogFile = m_logFile; ILMerge.Log = m_log; ILMerge.OutputFile = m_outputFile; ILMerge.KeyFile = m_keyFile; switch (m_targetKind.ToLower()) { case "winexe": ILMerge.TargetKind = ILMerge.Kind.WinExe; break; case "exe": ILMerge.TargetKind = ILMerge.Kind.Exe; break; case "dll": ILMerge.TargetKind = ILMerge.Kind.Dll; break; case "sameasprimary": ILMerge.TargetKind = ILMerge.Kind.SameAsPrimaryAssembly; break; default: throw new BuildException( "TargetKind should be [exe|dll|winexe|sameasprimary]"); } string[] assemblies = new string[m_assemblies.FileNames.Count + 1]; if (this.m_primaryAssembly.FileNames.Count != 1) { this.Log(Level.Error, "Only one primary assembly is allowed in the <primaryassembly> fileset, but found {0}.", this.m_primaryAssembly.FileNames.Count); return; } assemblies[0] = this.m_primaryAssembly.FileNames[0]; for (int i = 1; i < assemblies.Length; i++) { assemblies[i] = m_assemblies.FileNames[i-1]; } ILMerge.SetInputAssemblies(assemblies); List<string> searchPath = new List<string>(); searchPath.Add("."); if (LibraryPath != null) { foreach (string libpath in LibraryPath.FileNames) { searchPath.Add(libpath); } } ILMerge.SetSearchDirectories(searchPath.ToArray()); try { this.Log(Level.Info, "Merging {0} assembl{1} to '{2}'.", this.m_assemblies.FileNames.Count, (this.m_assemblies.FileNames.Count != 1) ? "ies" : "y", this.m_outputFile); ILMerge.Merge(); } catch (Exception e) { throw new BuildException("Failed to merge assemblies", e); } }
public void VersionedMergedAssembly() { if (!this.isILMergeAvailable) { Assert.Ignore(@"ILMerge.exe not available"); } ILMerge task = new ILMerge(); task.BuildEngine = new MockBuild(); task.InputAssemblies = this.inputAssemblies; task.OutputFile = new TaskItem(Path.Combine(this.testDirectory, @"merged5.dll")); task.AllowDuplicateTypes = TaskUtility.StringArrayToItemArray(@"ClassAB"); task.DebugInfo = false; task.XmlDocumentation = false; task.KeyFile = new TaskItem(this.keyFile); string version = @"5.6.7.8"; task.Version = version; Assert.IsTrue(task.Execute(), @"Task failed"); this.AssertResults(task, PublicCount, version); }
public void Setup() { _fileSystemHelper = MockRepository.GenerateMock<IFileSystemHelper>(); _subject = new ILMerge(_fileSystemHelper); }
public MainForm() { InitializeComponent(); merge = new ILMerge(); }
static void DoMerge(string outputFile, string[] dlls, ILMerge.Kind targetType = ILMerge.Kind.SameAsPrimaryAssembly, string logFile = null, bool getXml = false, bool getPDB = false, string version = null, string[] searchDirs = null) { if (string.IsNullOrEmpty(outputFile)) { throw new ArgumentException("未提供输出文件名outputFile"); } if (dlls == null || dlls.Length == 0) { throw new ArgumentException("未提供输入文件dlls"); } ILMerge merge = new ILMerge(); // 是否允许同名的public class,如果允许,把这些类型添加进去,比如需要合并有混淆的dll时(那些类被变成a、b、c之类了) // 如果AllowDuplicateType的参数设置为null,表示允许所有的同名类(用重命名的方法) // 默认不允许,如果有同名的public class会抛出异常 //merge.AllowDuplicateType(""); // 注:AllowDuplicateType不允许跟UnionMerge属性同时使用 // 默认值false merge.AllowWildCards = false;// 是否允许文件名里包含通配符,注:.. 这样的2个点 设置为true也不允许 //merge.Closed = true; //merge.AllowZeroPeKind = true; // 默认值true merge.DebugInfo = getPDB; // 是否要创建一个pdb调试文件 if (!string.IsNullOrEmpty(logFile)) { // 默认值false merge.Log = true; // 是否输出日志 merge.LogFile = logFile; // 如果为null,日志输出到控制台,否则输出到这个文件里 } // 必须设置 merge.OutputFile = outputFile; // 输出的文件路径+文件名 // 设置要合并的dll列表,第一个文件是主文件 //string[] dlls = new string[] { }; merge.SetInputAssemblies(dlls); // 如果dll列表没有设置全路径,那么会在dllDirs这些目录下查找 if (searchDirs != null && searchDirs.Length > 0) { string[] dllDirs = searchDirs; merge.SetSearchDirectories(dllDirs); } // 设置.net framework的版本,第一个参数只能是"v1", "v1.1", "v2", "v4" // 第二个参数是mscorlib.dll所在目录 //merge.SetTargetPlatform("", ""); // 默认跟主文件一致 merge.TargetKind = targetType; // 输出类型:Dll, Exe, WinExe // 如果设置为true,则所有同名的类型下的所有成员,会合并到一个类型下 // 默认值false // merge.UnionMerge = true; // 注:AllowDuplicateType不允许跟UnionMerge属性同时使用 // 默认值null 设置目标文件的版本号 if (!string.IsNullOrEmpty(version)) { merge.Version = new Version(version); } // 默认值false 是否合并出一个xml文档 merge.XmlDocumentation = getXml; merge.Merge(); }
private static void CreateSignedParser(string gherkinParserFullPath, Version version, string keyFullPath, string outputFileFullPath) { Console.WriteLine("Generating signed parser..."); ILMerge ilMerge = new ILMerge(); ilMerge.KeyFile = keyFullPath; ilMerge.Version = version; ilMerge.SetInputAssemblies(new[] { gherkinParserFullPath }); ilMerge.OutputFile = outputFileFullPath; ilMerge.TargetKind = ILMerge.Kind.Dll; ilMerge.Log = true; ilMerge.Merge(); Console.WriteLine(); }
public static void SetUpInputAssemblyForTest(this ILMerge ilMerge, Assembly inputAssembly) { ilMerge.SetSearchDirectories(ShadowCopyUtils.GetTransitiveClosureDirectories(inputAssembly).ToArray()); ilMerge.SetInputAssemblies(new[] { inputAssembly.Location }); }
protected override void ExecuteTask() { ILMerge = new ILMerge(); ILMerge.AttributeFile = m_attributeFile; ILMerge.Closed = m_closed; ILMerge.CopyAttributes = m_copyAttributes; ILMerge.DebugInfo = m_debugInfo; ILMerge.ExcludeFile = m_excludeFile; ILMerge.Internalize = m_internalize; ILMerge.LogFile = m_logFile; ILMerge.Log = m_log; ILMerge.OutputFile = m_outputFile; ILMerge.KeyFile = m_keyFile; switch (m_targetKind.ToLower()) { case "winexe": ILMerge.TargetKind = ILMerge.Kind.WinExe; break; case "exe": ILMerge.TargetKind = ILMerge.Kind.Exe; break; case "dll": ILMerge.TargetKind = ILMerge.Kind.Dll; break; case "sameasprimary": ILMerge.TargetKind = ILMerge.Kind.SameAsPrimaryAssembly; break; default: throw new BuildException( "TargetKind should be [exe|dll|winexe|sameasprimary]"); } string[] assemblies = new string[m_assemblies.FileNames.Count + 1]; if (this.m_primaryAssembly.FileNames.Count != 1) { this.Log(Level.Error, "Only one primary assembly is allowed in the <primaryassembly> fileset, but found {0}.", this.m_primaryAssembly.FileNames.Count); return; } assemblies[0] = this.m_primaryAssembly.FileNames[0]; for (int i = 1; i < assemblies.Length; i++) { assemblies[i] = m_assemblies.FileNames[i - 1]; } ILMerge.SetInputAssemblies(assemblies); List <string> searchPath = new List <string>(); searchPath.Add("."); if (LibraryPath != null) { foreach (string libpath in LibraryPath.FileNames) { searchPath.Add(libpath); } } ILMerge.SetSearchDirectories(searchPath.ToArray()); try { this.Log(Level.Info, "Merging {0} assembl{1} to '{2}'.", this.m_assemblies.FileNames.Count, (this.m_assemblies.FileNames.Count != 1) ? "ies" : "y", this.m_outputFile); ILMerge.Merge(); } catch (Exception e) { throw new BuildException("Failed to merge assemblies", e); } }
public void FixtureInit() { this.isILMergeAvailable = File.Exists(Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Microsoft\ILMerge\ILMerge.exe")); MockBuild buildEngine = new MockBuild(); this.testDirectory = TaskUtility.makeTestDirectory(buildEngine); ILMerge task = new ILMerge(); task.BuildEngine = buildEngine; if (TaskUtility.CalledInBuildDirectory) { this.assemblyA = Path.Combine(this.testDirectory, @"A.dll"); this.assemblyB = Path.Combine(this.testDirectory, @"B.dll"); this.excludeFile = Path.Combine(this.testDirectory, @"ExcludeTypes.txt"); this.keyFile = Path.Combine(this.testDirectory, @"keypair.snk"); } else { string config = TaskUtility.BuildConfiguration; string assDir = Path.GetFullPath(TaskUtility.AssemblyDirectory); this.assemblyA = Path.GetFullPath(Path.Combine(assDir, @"..\..\ILMerge\A\bin\" + config + @"\A.dll")); this.assemblyB = Path.GetFullPath(Path.Combine(assDir, @"..\..\ILMerge\B\bin\" + config + @"\B.dll")); this.excludeFile = Path.Combine(assDir, @"ILMerge\ExcludeTypes.txt"); this.keyFile = Path.Combine(assDir, @"ILMerge\keypair.snk"); } this.inputAssemblies = TaskUtility.StringArrayToItemArray(this.assemblyA, this.assemblyB); }
/// <summary> /// Performs packing. /// </summary> public void Run() { // Steps // 1) Mono.Cecil: Determine assembly dependencies // 2) ILMerge: Merge exe into a single assembly // 3) Mono.Linker var includeMergeListRegex = new string[] { @"SharpDX\..*" }; // Step 1 : Mono.Cecil: Determine assembly dependencies var assembly = AssemblyDefinition.ReadAssembly(MainAssembly); var corlib = (AssemblyNameReference)assembly.MainModule.TypeSystem.Corlib; bool isNet40 = corlib.Version.Major == 4; var assemblyReferences = new List <AssemblyDefinition>(); var paths = new List <string>(); paths.Add(assembly.MainModule.FullyQualifiedName); var fromDirectory = Path.GetDirectoryName(assembly.MainModule.FullyQualifiedName); // Load SharpDX assemblies foreach (var assemblyRef in assembly.MainModule.AssemblyReferences) { bool isAssemblyAdded = false; foreach (var regexIncludeStr in includeMergeListRegex) { var regexInclude = new Regex(regexIncludeStr); if (regexInclude.Match(assemblyRef.Name).Success) { var assemblyDefRef = assembly.MainModule.AssemblyResolver.Resolve(assemblyRef); assemblyReferences.Add(assemblyDefRef); paths.Add(assemblyDefRef.MainModule.FullyQualifiedName); isAssemblyAdded = true; break; } } if (!isAssemblyAdded && AutoReferences) { var assemblyDefRef = assembly.MainModule.AssemblyResolver.Resolve(assemblyRef); var directoryOfAssembly = Path.GetDirectoryName(assemblyDefRef.MainModule.FullyQualifiedName); if (fromDirectory == directoryOfAssembly) { paths.Add(assemblyDefRef.MainModule.FullyQualifiedName); } } } // Load assemblies to link foreach (var assemblyToLinkName in AssembliesToLink) { var assemblyToLink = AssemblyDefinition.ReadAssembly(assemblyToLinkName); paths.Add(assemblyToLink.MainModule.FullyQualifiedName); } // Step 2: ILMerge: Merge exe into a single assembly var merge = new ILMerge(); String[] files = paths.ToArray(); if (!Directory.Exists(OutputDirectory)) { Directory.CreateDirectory(OutputDirectory); } //Here we get the first file name (which was the .exe file) and use that // as the output String strOutputFile = System.IO.Path.GetFileName(files[0]); merge.OutputFile = OutputDirectory + "\\" + strOutputFile; merge.SetInputAssemblies(files); merge.DebugInfo = false; merge.XmlDocumentation = false; // Special case for v4 framework // See http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx if (isNet40) { // Retrieve the install root path for the framework string installRoot = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\.NetFramework", false).GetValue("InstallRoot").ToString(); var directorties = Directory.GetDirectories(installRoot, "v4.*"); if (directorties.Length == 0) { UsageError(string.Format(System.Globalization.CultureInfo.InvariantCulture, "Cannot found any .Net 4.0 directory from [{0}] ", installRoot)); } merge.SetTargetPlatform("v4", directorties[0]); } merge.Merge(); // Step 3: Mono.Linker if (!NoLinker) { var pipeline = GetStandardPipeline(); var context = new LinkContext(pipeline) { CoreAction = AssemblyAction.Skip, OutputDirectory = OutputDirectory }; context.OutputDirectory = OutputDirectory; var mainAssemblyDirectory = new DirectoryInfo(Path.GetDirectoryName(Path.GetFullPath(MainAssembly))); context.Resolver.AddSearchDirectory(mainAssemblyDirectory.FullName); // Load assembly merged previously by ILMerge var mergedAssemblyDefinition = context.Resolve(merge.OutputFile); // Create Mono.Linker default pipeline pipeline = GetStandardPipeline(); pipeline.PrependStep(new ResolveFromAssemblyStep(mergedAssemblyDefinition)); // Add custom step for ComObject constructors pipeline.AddStepBefore(typeof(SweepStep), new ComObjectStep()); pipeline.Process(context); } Console.WriteLine("Assembly successfully packed to [{0}]", merge.OutputFile); }
static void Main(string[] args) { ReadConfiguration(); ParseArguments(args); var providerOptions = new Dictionary<string, string>(); providerOptions.Add("CompilerVersion", "v3.5"); CSharpCodeProvider cp = new CSharpCodeProvider(providerOptions); CompilerParameters cparams = new CompilerParameters(); cparams.GenerateExecutable = true; cparams.OutputAssembly = "Setup_Temp.exe"; cparams.ReferencedAssemblies.AddRange(FrwkAssemblyRefs.Concat(ExtAssemblyRefs).ToArray()); cparams.EmbeddedResources.Add(PackageFile); string libpathstr = string.Empty; foreach (var path in LibPaths) { libpathstr += "\"" + path + "\" "; } if (LibPaths.Length > 0) { cparams.CompilerOptions = String.Format("/lib:{0}", libpathstr); } // Add modules if (ModuleRefs.Length > 0) { StringBuilder sb = new StringBuilder(); sb.Append("/addmodule:"); foreach ( var mr in ModuleRefs ) { sb.Append(mr + " "); } cparams.CompilerOptions += sb.ToString(); } CompilerResults cr = cp.CompileAssemblyFromFile(cparams, Sources); cr.Errors.OfType<CompilerError>().ToList() .ForEach((e) => Console.WriteLine((e.IsWarning ? "Warning : " : "Error : ") + e.ErrorText)); foreach ( CompilerError r in cr.Errors ) { if (!r.IsWarning) { return; } } // Merge the IL to create a single assembly ILMerge merger = new ILMerge(); merger.OutputFile = "Setup.exe"; string[] primaryAssembly = new string[] { "Setup_Temp.exe" }; string[] assemblies = primaryAssembly.Concat(ExtAssemblyRefs).ToArray(); merger.SetInputAssemblies(assemblies); merger.Merge(); File.Delete("Setup_Temp.exe"); }
static void Main(string[] args) { #if !DEBUG Version networkCommsVersion = new Version(Assembly.ReflectionOnlyLoad("NetworkCommsDotNet").FullName. Split(','). Where(s => s.Split('=').Length == 2). ToDictionary(s => s.Split('=')[0].Trim(), s => s.Split('=')[1].Trim())["Version"]); string targetPlatform = "v2"; string msCoreLibDirectory = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727"; bool coreBuildEnabled = false; bool completeBuildEnabled = true; #region Merge Core if (coreBuildEnabled) { Directory.CreateDirectory("MergedCore"); File.Delete(@"MergedCore\MergeLog.txt"); ILMerge coreMerge = new ILMerge(); List<string> coreAssembles = new List<string>(); coreAssembles.Add("NetworkCommsDotNet.dll"); coreAssembles.Add("protobuf-net.dll"); coreAssembles.Add("ProtobufSerializer.dll"); coreMerge.SetInputAssemblies(coreAssembles.ToArray()); coreMerge.Version = networkCommsVersion; coreMerge.TargetKind = ILMerge.Kind.Dll; coreMerge.SetTargetPlatform(targetPlatform, msCoreLibDirectory); coreMerge.XmlDocumentation = true; coreMerge.KeyFile = "networkcomms.net.snk"; coreMerge.OutputFile = @"MergedCore\NetworkCommsDotNetCore.dll"; coreMerge.Log = true; coreMerge.LogFile = @"MergedCore\MergeLog.txt"; coreMerge.Merge(); } #endregion #region Merge Complete if (completeBuildEnabled) { Directory.CreateDirectory("MergedComplete"); File.Delete(@"MergedComplete\MergeLog.txt"); ILMerge completeMerge = new ILMerge(); List<string> completeAssembles = new List<string>(); completeAssembles.Add("NetworkCommsDotNet.dll"); completeAssembles.Add("protobuf-net.dll"); completeAssembles.Add("ProtobufSerializer.dll"); completeAssembles.Add("ICSharpCode.SharpZipLib.dll"); completeAssembles.Add("SharpZipLibCompressor.dll"); //completeAssembles.Add("QuickLZCompressor.dll"); completeAssembles.Add("InTheHand.Net.Personal.dll"); completeMerge.SetInputAssemblies(completeAssembles.ToArray()); completeMerge.Version = networkCommsVersion; completeMerge.TargetKind = ILMerge.Kind.Dll; completeMerge.SetTargetPlatform(targetPlatform, msCoreLibDirectory); completeMerge.XmlDocumentation = true; completeMerge.KeyFile = "networkcomms.net.snk"; completeMerge.OutputFile = @"MergedComplete\NetworkCommsDotNetComplete.dll"; completeMerge.Log = true; completeMerge.LogFile = @"MergedComplete\MergeLog.txt"; completeMerge.Merge(); } #endregion #endif }
public void PrimaryTypesAndExclusions() { if (!this.isILMergeAvailable) { Assert.Ignore(@"ILMerge.exe not available"); } ILMerge task = new ILMerge(); task.BuildEngine = new MockBuild(); task.InputAssemblies = this.inputAssemblies; task.OutputFile = new TaskItem(Path.Combine(this.testDirectory, @"merged3.dll")); task.AllowDuplicateTypes = TaskUtility.StringArrayToItemArray(@"ClassAB"); task.DebugInfo = false; task.XmlDocumentation = false; task.ExcludeFile = new TaskItem(this.excludeFile); Assert.IsTrue(task.Execute(), @"Task failed"); this.AssertResults(task, PublicACount + 1, VersionA); }