To use a dll as embedded resource in Visual Studio: -Put both the embedding project and the embedded project in one solution. -Add the embedded project to the embedding project's References. -Build the embedded project, and copy that built dll into q subfolder in the embedding project. -In the embedding project's properties, go to Resources, and add that copied dll as file resource. -In the embedding project, if the class containing "Main" already uses the embedded dll's namespace, add the complete class below as main program, and rename the "Main" function in your real program to "Run". -If not, it suffices to add the CurrentDomain_AssemblyResolve function, and to start the Main function with the ResolveEventHandler line. -Now, in the embedding project's Build Events, add pre-build code that copies the newly build version of the embedded project dll in the embedding project's files, to overwrite the older copied version. This example script will work if the two projects both have a folder in the same parent folder, and the copied dll was put in an "Include" folder in the embedding project: copy /y "$(ProjectDir)..\EmbeddedProject\$(OutDir)EmbeddedProject.dll" "$(ProjectDir)Include" -Finally, in the embedding project's references list, click the embedded project, and set its "Copy Local" setting to False, so the dll is not copied to the output folder when the project is built. ------------------------------------------------------------------------------- The following is the dll loading code. "EmbeddingProgram.Run(args)" is the original "Main" of the embedding project. Note: in "typeof(Program).Namespace" the "Program" should be the class name. ------------------------------------------------------------------------------- using System; using System.Linq; using System.Reflection; namespace EmbeddingProjectNameSpace { public class Program { [STAThread] public static Int32 Main(String[] args) { // Code to load embedded dll file AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); return EmbeddingProgram.Run(args); } /// /// Code to load embedded dll file. This is called when loading of an assembly fails. If the dll is embedded, the problem is resolved and the dll is loaded this way. /// Based on http://stackoverflow.com/a/6362414/395685 /// /// The source of the event. /// A System.ResolveEventArgs that contains the event data. /// The System.Reflection.Assembly that resolves the type, assembly, or resource; or null if the assembly cannot be resolved. private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { String dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", ""); dllName = dllName.Replace(".", "_"); if (dllName.EndsWith("_resources")) return null; System.Resources.ResourceManager rm = new System.Resources.ResourceManager(typeof(Program).Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly()); Byte[] dllBytes = rm.GetObject(dllName) as Byte[]; if (dllBytes != null) return System.Reflection.Assembly.Load(dllBytes); else return null; } } }