While working as a developer, many times we will have some readymade tools or class libraries / DLLs, which were developed by some other developers and they publish for developer kind. Salute to their generosity.
We use those libraries in our development and our life becomes little easier. But while deploying it on other environments we have to install those things and or keep those DLLs on another environment, if we miss it then because of those open libraries, development breaks.
So in such conditions, we can merge multiple DLLs in one to make our life bit easier.
If it’s exe, user following function to make one DDL.
Advantage: it will keep the original identity of the DDL.
Disadvantage: it won’t work for the library building. For e.g. CRM plugins
Here is that great function …
private static void AsseblyResolveEvent()
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
String resourceName = "AssemblyLoadingAndReflection." +
new AssemblyName(args.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};
}
Curtsy: This function has written by Jeffrey Richter, here is his article for it.
If it’s DDL and or class libraries, ILMerge will useful.
Advantages: it’s free and lite installation. Easy to use.
Disadvantage: After merging DDLs with ILMerge, DDL will lose its identity, that’s why we can not use for CRM plugin libraries. While writing commands we need to bit careful else spelling mistake might frustrate you. 😉
You need to install it after download from here. Then by following commands, you can merge multiple DDLs together.
Steps: Once its installed, open command window with admin rights and execute it, follow the commands
Step 1: Download ILMerge utility and install it in your machine
http://www.microsoft.com/en-us/download/details.aspx?id=17630
Step 2: Compile and Publish your Project to a folder (eg: C:\Publish\)
Step 3: Use the ilmerge command to merge the exe and dll files and output single exe file
ILMerge Command
Syntax (Simple*): ilmerge <input assembly 1> <input assembly 2> /out:<output file> /target:<dll|exe|winexe>
*For the complete set of options and syntax refer ILMerge Documentation
Example:
C:\Program Files\Microsoft\ILMerge>ilmerge C:\Publish\MyProgram.exe C:\Publish\MyLibrary.dll /out:C:\Publish\MyWinApp.exe /target:winexe /ndebug
ilmerge – Command
MyProgram.exe – Output from the published folder
MyLibrary.dll – Any library used in the program
/target:winexe – We need to output a single exe file for Windows Platform
/output – Output folder and filename
/ndebug – To disable debug (.pdb file)
Curtsy: Arun Ramchandran’s blog , for more info, explore this link and this link.
Above both options won’t be useful for MSD CRM or MSD 365. 😔
So, to make those libraries useful for these environments we have to create a folder in your plugin project so it will be part of plugin project. And we don’t need to merge it anymore. 😉
Thus, we have two options available for it,
If those libraries are open source then we will get everything available online(thanks to generous great developers), just get only those classes which useful for you and ignore the rest of classes from that DDL.
But if it’s not open source then we need bit more efforts. As we need to use ILSpy or some similar add-on to decompile that code and then use in our plugin or workflow library.
There is another way for same is merging these files together along with its signature. Here are the details for it. (Courtesy: github )
Use Nuget to add ILMerge.MSBuild.Task to your Visual Studio project:
Install-Package ILMerge.MSBuild.Task
Also, install the ILMerge Package:
Install-Package ilmerge
Build your project. The merged assembly will be stored in an ILMerge folder under the project output.
Merge Assemblies With Copy Local = True
By default, all references with Copy Local equals true are merged with your project output.
Creating a Static List of Assemblies to Merge
It is also possible to use a static list of assemblies instead of inspecting the Copy Local property. This can be done through a configuration file added to the root of your project. Create a JSON file and name it as follows:
ILMergeConfig.json
The following snippet uses the InputAssemblies property to specify the files to be merged into the project output.
{
"General": {
"InputAssemblies": [
"$(SolutionDir)libs\\XrmUtils.Plugins.Abstractions.dll",
"$(SolutionDir)libs\\XrmUtils.Plugins.Utilitiesd.dll"
]
}
}
You don’t have to specify a path if assemblies are expected to be in the target directory:
{
"General": {
"InputAssemblies": [
"XrmUtils.Plugins.Abstractions.dll",
"XrmUtils.Plugins.Utilities.dll"
]
}
}
See Configuration File complete reference.
That’s it for now.
Thanks!
Few more ref
- http://develop1.net/public/post/2018/10/21/ILMergeNotSupported
- https://medium.com/capgemini-dynamics-365-team/using-gov-uk-notify-in-a-dynamics-crm-plugin-without-ilmerge-cf89f372cd5d
Continue reading “DLL merge and MSD CRM/365 (on-prem/On-Line)” →