Embedding assemblies inside another assembly












39















If you create a class library that uses things from other assemblies, is it possible to embed those other assemblies inside the class library as some kind of resource?



I.e. instead of having MyAssembly.dll, SomeAssembly1.dll and SomeAssembly2.dll sitting on the file system, those other two files get bundled in to MyAssembly.dll and are usable in its code.





I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET? Are all .NET assemblies DLLs, but not all DLLs are .NET assemblies? Why do they use the same file format and/or file extension?










share|improve this question





























    39















    If you create a class library that uses things from other assemblies, is it possible to embed those other assemblies inside the class library as some kind of resource?



    I.e. instead of having MyAssembly.dll, SomeAssembly1.dll and SomeAssembly2.dll sitting on the file system, those other two files get bundled in to MyAssembly.dll and are usable in its code.





    I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET? Are all .NET assemblies DLLs, but not all DLLs are .NET assemblies? Why do they use the same file format and/or file extension?










    share|improve this question



























      39












      39








      39


      28






      If you create a class library that uses things from other assemblies, is it possible to embed those other assemblies inside the class library as some kind of resource?



      I.e. instead of having MyAssembly.dll, SomeAssembly1.dll and SomeAssembly2.dll sitting on the file system, those other two files get bundled in to MyAssembly.dll and are usable in its code.





      I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET? Are all .NET assemblies DLLs, but not all DLLs are .NET assemblies? Why do they use the same file format and/or file extension?










      share|improve this question
















      If you create a class library that uses things from other assemblies, is it possible to embed those other assemblies inside the class library as some kind of resource?



      I.e. instead of having MyAssembly.dll, SomeAssembly1.dll and SomeAssembly2.dll sitting on the file system, those other two files get bundled in to MyAssembly.dll and are usable in its code.





      I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET? Are all .NET assemblies DLLs, but not all DLLs are .NET assemblies? Why do they use the same file format and/or file extension?







      c# .net dll assemblies






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 15 '10 at 19:36









      Peter Mortensen

      13.6k1984111




      13.6k1984111










      asked Oct 21 '08 at 17:01









      xyzxyz

      13.7k2489120




      13.7k2489120
























          8 Answers
          8






          active

          oldest

          votes


















          35














          Take a look at ILMerge for merging assemblies.




          I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET?




          Yes.




          Are all .NET assemblies DLLs,




          Either DLLs or EXE normally - but can also be netmodule.




          but not all DLLs are .NET assemblies?




          Correct.




          Why do they use the same file format and/or file extension?




          Why should it be any different - it serves the same purpose!






          share|improve this answer





















          • 2





            .netmodule is for Modules, which are parts of an assembly (e.g., built with different language compilers) but aren't standalone assemblies.

            – Mark Cidade
            Oct 21 '08 at 17:13



















          55














          ILMerge does merge assemblies, which is nice, but sometimes not quite what you want. For example, when the assembly in question is a strongly-named assembly, and you don't have the key for it, then you cannot do ILMerge without breaking that signature. Which means you have to deploy multiple assemblies.



          As an alternative to ilmerge, you can embed one or more assemblies as resources into your exe or DLL. Then, at runtime, when the assemblies are being loaded, you can extract the embedded assembly programmatically, and load and run it. It sounds tricky but there's just a little bit of boilerplate code.



          To do it, embed an assembly, just as you would embed any other resource (image, translation file, data, etc). Then, set up an AssemblyResolver that gets called at runtime. It should be set up in the static constructor of the startup class. The code is very simple.



              static NameOfStartupClassHere()
          {
          AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver);
          }

          static System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args)
          {
          Assembly a1 = Assembly.GetExecutingAssembly();
          Stream s = a1.GetManifestResourceStream(args.Name);
          byte block = new byte[s.Length];
          s.Read(block, 0, block.Length);
          Assembly a2 = Assembly.Load(block);
          return a2;
          }


          The Name property on the ResolveEventArgs parameter is the name of the assembly to be resolved. This name refers to the resource, not to the filename. If you embed the file named "MyAssembly.dll", and call the embedded resource "Foo", then the name you want here is "Foo". But that would be confusing, so I suggest using the filename of the assembly for the name of the resource. If you have embedded and named your assembly properly, you can just call GetManifestResourceStream() with the assembly name and load the assembly that way. Very simple.



          This works with multiple assemblies, just as nicely as with a single embedded assembly.



          In a real app you're gonna want better error handling in that routine - like what if there is no stream by the given name? What happens if the Read fails? etc. But that's left for you to do.



          In the rest of the application code, you use types from the assembly as normal.



          When you build the app, you need to add a reference to the assembly in question, as you would normally. If you use the command-line tools, use the /r option in csc.exe; if you use Visual Studio, you'll need to "Add Reference..." in the popup menu on the project.



          At runtime, assembly version-checking and verification works as usual.



          The only difference is in distribution. When you deploy or distribute your app, you need not distribute the DLL for the embedded (and referenced) assembly. Just deploy the main assembly; there's no need to distribute the other assemblies because they're embedded into the main DLL or EXE.






          share|improve this answer


























          • Wow I never thought of doing that... to be honest I'm surprised it works.

            – devios1
            Jul 31 '10 at 18:55











          • That's pretty nifty.

            – spender
            Dec 8 '10 at 1:40











          • The GetManifestResourceStream(args.Name) probably should be GetManifestResourceStream(string.Format("{0}.lib.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)) or GetManifestResourceStream(string.Format("{0}.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)). I don't know the reasons why but I've has to use either of these.

            – mheyman
            Mar 16 '12 at 16:35













          • @mheyman - re: * I don't know the reasons why...*. it just depends on how you name the embedded resources when you compile the thing. You can use this to diagnose: cheeso.members.winisp.net/… (A tool that displays the names of the embedded resources in an assembly)

            – Cheeso
            May 16 '12 at 18:13






          • 1





            I'm assuming that code snippet should be put in a void Main(args) function for an exe, but where do we put this code if we're creating a class library?

            – jtate
            Jun 26 '17 at 15:28



















          7














          You can embed an assembly (or any file, actually) as a resource (and then use the ResourceManager class to access them), but if you just want to combine assemblies, you're better off using a tool like ILMerge.



          EXE and DLL files are Windows portable executables, which are generic enough to accomodate future types of code, including any .NET code (they can also run in DOS but only display a message saying that they're not supposed to run in DOS). They include instructions to fire up the .NET runtime if it isn't already running. It's also possible for a single assembly to span across multiple files, though this is hardly ever the case.






          share|improve this answer































            5














            Note ILMerge doesn't work with embedded resources like XAML, so WPF apps etc will need to use Cheeso's method.






            share|improve this answer































              4














              There's also the mkbundle utility offered by the Mono project






              share|improve this answer
























              • For the records: This only works for mono applications as also bundles the mono runtime. From the docs: Bundles merge your application, the libraries it uses and the Mono runtime into a single executable image. You can think of bundles as “statically linking mono” into your application.

                – CodeFox
                Sep 22 '15 at 4:12





















              1














              Why do they use the same file format and/or file extension?





              Why should it be any different - it serves the same purpose!





              My 2¢ bit of clarification here: DLL is Dynamic Link Library. Both the old style .dll (C-code) and .net style .dll are by definition "dynamic link" libraries. So .dll is a proper description for both.






              share|improve this answer































                0














                With respect to Cheeso's answer of embedding the assemblies as resources and loading them dynamically using the Load(byte) overload using an AssemblyResolve event handler, you need to modify the resolver to check the AppDomain for an existing instance of the Assembly to load and return the existing assembly instance if it's already loaded.



                Assemblies loaded using that overload do not have a context, which can cause the framework to try and reload the assembly multiple times. Without returning an already loaded instance, you can end up with multiple instances of the same assembly code and types that should be equal but won't be, because the framework considers them to be from two different assemblies.



                At least one way that multiple AssemblyResolve events will be made for the same assembly loaded into the "No context" is when you have references to types it exposes from multiple assemblies loaded into your AppDomain, as code executes that needs those types resolved.



                https://msdn.microsoft.com/en-us/library/dd153782%28v=vs.110%29.aspx



                A couple of salient points from the link:



                "Other assemblies cannot bind to assemblies that are loaded without context, unless you handle the AppDomain.AssemblyResolve event"



                "Loading multiple assemblies with the same identity without context can cause type identity problems similar to those caused by loading assemblies with the same identity into multiple contexts. See Avoid Loading an Assembly into Multiple Contexts."






                share|improve this answer































                  0














                  I would suggest you to try Costura.Fody. Just don't forget to Install-Package Fody before Costura.Fody (in order to get the newest Fody!)






                  share|improve this answer

























                    Your Answer






                    StackExchange.ifUsing("editor", function () {
                    StackExchange.using("externalEditor", function () {
                    StackExchange.using("snippets", function () {
                    StackExchange.snippets.init();
                    });
                    });
                    }, "code-snippets");

                    StackExchange.ready(function() {
                    var channelOptions = {
                    tags: "".split(" "),
                    id: "1"
                    };
                    initTagRenderer("".split(" "), "".split(" "), channelOptions);

                    StackExchange.using("externalEditor", function() {
                    // Have to fire editor after snippets, if snippets enabled
                    if (StackExchange.settings.snippets.snippetsEnabled) {
                    StackExchange.using("snippets", function() {
                    createEditor();
                    });
                    }
                    else {
                    createEditor();
                    }
                    });

                    function createEditor() {
                    StackExchange.prepareEditor({
                    heartbeatType: 'answer',
                    autoActivateHeartbeat: false,
                    convertImagesToLinks: true,
                    noModals: true,
                    showLowRepImageUploadWarning: true,
                    reputationToPostImages: 10,
                    bindNavPrevention: true,
                    postfix: "",
                    imageUploader: {
                    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                    allowUrls: true
                    },
                    onDemand: true,
                    discardSelector: ".discard-answer"
                    ,immediatelyShowMarkdownHelp:true
                    });


                    }
                    });














                    draft saved

                    draft discarded


















                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f222655%2fembedding-assemblies-inside-another-assembly%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown

























                    8 Answers
                    8






                    active

                    oldest

                    votes








                    8 Answers
                    8






                    active

                    oldest

                    votes









                    active

                    oldest

                    votes






                    active

                    oldest

                    votes









                    35














                    Take a look at ILMerge for merging assemblies.




                    I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET?




                    Yes.




                    Are all .NET assemblies DLLs,




                    Either DLLs or EXE normally - but can also be netmodule.




                    but not all DLLs are .NET assemblies?




                    Correct.




                    Why do they use the same file format and/or file extension?




                    Why should it be any different - it serves the same purpose!






                    share|improve this answer





















                    • 2





                      .netmodule is for Modules, which are parts of an assembly (e.g., built with different language compilers) but aren't standalone assemblies.

                      – Mark Cidade
                      Oct 21 '08 at 17:13
















                    35














                    Take a look at ILMerge for merging assemblies.




                    I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET?




                    Yes.




                    Are all .NET assemblies DLLs,




                    Either DLLs or EXE normally - but can also be netmodule.




                    but not all DLLs are .NET assemblies?




                    Correct.




                    Why do they use the same file format and/or file extension?




                    Why should it be any different - it serves the same purpose!






                    share|improve this answer





















                    • 2





                      .netmodule is for Modules, which are parts of an assembly (e.g., built with different language compilers) but aren't standalone assemblies.

                      – Mark Cidade
                      Oct 21 '08 at 17:13














                    35












                    35








                    35







                    Take a look at ILMerge for merging assemblies.




                    I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET?




                    Yes.




                    Are all .NET assemblies DLLs,




                    Either DLLs or EXE normally - but can also be netmodule.




                    but not all DLLs are .NET assemblies?




                    Correct.




                    Why do they use the same file format and/or file extension?




                    Why should it be any different - it serves the same purpose!






                    share|improve this answer















                    Take a look at ILMerge for merging assemblies.




                    I'm also a little confused about why .NET assemblies are .dll files. Didn't this format exist before .NET?




                    Yes.




                    Are all .NET assemblies DLLs,




                    Either DLLs or EXE normally - but can also be netmodule.




                    but not all DLLs are .NET assemblies?




                    Correct.




                    Why do they use the same file format and/or file extension?




                    Why should it be any different - it serves the same purpose!







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Dec 16 '14 at 15:12









                    Anthony

                    5,46573568




                    5,46573568










                    answered Oct 21 '08 at 17:11









                    AtliBAtliB

                    91311427




                    91311427








                    • 2





                      .netmodule is for Modules, which are parts of an assembly (e.g., built with different language compilers) but aren't standalone assemblies.

                      – Mark Cidade
                      Oct 21 '08 at 17:13














                    • 2





                      .netmodule is for Modules, which are parts of an assembly (e.g., built with different language compilers) but aren't standalone assemblies.

                      – Mark Cidade
                      Oct 21 '08 at 17:13








                    2




                    2





                    .netmodule is for Modules, which are parts of an assembly (e.g., built with different language compilers) but aren't standalone assemblies.

                    – Mark Cidade
                    Oct 21 '08 at 17:13





                    .netmodule is for Modules, which are parts of an assembly (e.g., built with different language compilers) but aren't standalone assemblies.

                    – Mark Cidade
                    Oct 21 '08 at 17:13













                    55














                    ILMerge does merge assemblies, which is nice, but sometimes not quite what you want. For example, when the assembly in question is a strongly-named assembly, and you don't have the key for it, then you cannot do ILMerge without breaking that signature. Which means you have to deploy multiple assemblies.



                    As an alternative to ilmerge, you can embed one or more assemblies as resources into your exe or DLL. Then, at runtime, when the assemblies are being loaded, you can extract the embedded assembly programmatically, and load and run it. It sounds tricky but there's just a little bit of boilerplate code.



                    To do it, embed an assembly, just as you would embed any other resource (image, translation file, data, etc). Then, set up an AssemblyResolver that gets called at runtime. It should be set up in the static constructor of the startup class. The code is very simple.



                        static NameOfStartupClassHere()
                    {
                    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver);
                    }

                    static System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args)
                    {
                    Assembly a1 = Assembly.GetExecutingAssembly();
                    Stream s = a1.GetManifestResourceStream(args.Name);
                    byte block = new byte[s.Length];
                    s.Read(block, 0, block.Length);
                    Assembly a2 = Assembly.Load(block);
                    return a2;
                    }


                    The Name property on the ResolveEventArgs parameter is the name of the assembly to be resolved. This name refers to the resource, not to the filename. If you embed the file named "MyAssembly.dll", and call the embedded resource "Foo", then the name you want here is "Foo". But that would be confusing, so I suggest using the filename of the assembly for the name of the resource. If you have embedded and named your assembly properly, you can just call GetManifestResourceStream() with the assembly name and load the assembly that way. Very simple.



                    This works with multiple assemblies, just as nicely as with a single embedded assembly.



                    In a real app you're gonna want better error handling in that routine - like what if there is no stream by the given name? What happens if the Read fails? etc. But that's left for you to do.



                    In the rest of the application code, you use types from the assembly as normal.



                    When you build the app, you need to add a reference to the assembly in question, as you would normally. If you use the command-line tools, use the /r option in csc.exe; if you use Visual Studio, you'll need to "Add Reference..." in the popup menu on the project.



                    At runtime, assembly version-checking and verification works as usual.



                    The only difference is in distribution. When you deploy or distribute your app, you need not distribute the DLL for the embedded (and referenced) assembly. Just deploy the main assembly; there's no need to distribute the other assemblies because they're embedded into the main DLL or EXE.






                    share|improve this answer


























                    • Wow I never thought of doing that... to be honest I'm surprised it works.

                      – devios1
                      Jul 31 '10 at 18:55











                    • That's pretty nifty.

                      – spender
                      Dec 8 '10 at 1:40











                    • The GetManifestResourceStream(args.Name) probably should be GetManifestResourceStream(string.Format("{0}.lib.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)) or GetManifestResourceStream(string.Format("{0}.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)). I don't know the reasons why but I've has to use either of these.

                      – mheyman
                      Mar 16 '12 at 16:35













                    • @mheyman - re: * I don't know the reasons why...*. it just depends on how you name the embedded resources when you compile the thing. You can use this to diagnose: cheeso.members.winisp.net/… (A tool that displays the names of the embedded resources in an assembly)

                      – Cheeso
                      May 16 '12 at 18:13






                    • 1





                      I'm assuming that code snippet should be put in a void Main(args) function for an exe, but where do we put this code if we're creating a class library?

                      – jtate
                      Jun 26 '17 at 15:28
















                    55














                    ILMerge does merge assemblies, which is nice, but sometimes not quite what you want. For example, when the assembly in question is a strongly-named assembly, and you don't have the key for it, then you cannot do ILMerge without breaking that signature. Which means you have to deploy multiple assemblies.



                    As an alternative to ilmerge, you can embed one or more assemblies as resources into your exe or DLL. Then, at runtime, when the assemblies are being loaded, you can extract the embedded assembly programmatically, and load and run it. It sounds tricky but there's just a little bit of boilerplate code.



                    To do it, embed an assembly, just as you would embed any other resource (image, translation file, data, etc). Then, set up an AssemblyResolver that gets called at runtime. It should be set up in the static constructor of the startup class. The code is very simple.



                        static NameOfStartupClassHere()
                    {
                    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver);
                    }

                    static System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args)
                    {
                    Assembly a1 = Assembly.GetExecutingAssembly();
                    Stream s = a1.GetManifestResourceStream(args.Name);
                    byte block = new byte[s.Length];
                    s.Read(block, 0, block.Length);
                    Assembly a2 = Assembly.Load(block);
                    return a2;
                    }


                    The Name property on the ResolveEventArgs parameter is the name of the assembly to be resolved. This name refers to the resource, not to the filename. If you embed the file named "MyAssembly.dll", and call the embedded resource "Foo", then the name you want here is "Foo". But that would be confusing, so I suggest using the filename of the assembly for the name of the resource. If you have embedded and named your assembly properly, you can just call GetManifestResourceStream() with the assembly name and load the assembly that way. Very simple.



                    This works with multiple assemblies, just as nicely as with a single embedded assembly.



                    In a real app you're gonna want better error handling in that routine - like what if there is no stream by the given name? What happens if the Read fails? etc. But that's left for you to do.



                    In the rest of the application code, you use types from the assembly as normal.



                    When you build the app, you need to add a reference to the assembly in question, as you would normally. If you use the command-line tools, use the /r option in csc.exe; if you use Visual Studio, you'll need to "Add Reference..." in the popup menu on the project.



                    At runtime, assembly version-checking and verification works as usual.



                    The only difference is in distribution. When you deploy or distribute your app, you need not distribute the DLL for the embedded (and referenced) assembly. Just deploy the main assembly; there's no need to distribute the other assemblies because they're embedded into the main DLL or EXE.






                    share|improve this answer


























                    • Wow I never thought of doing that... to be honest I'm surprised it works.

                      – devios1
                      Jul 31 '10 at 18:55











                    • That's pretty nifty.

                      – spender
                      Dec 8 '10 at 1:40











                    • The GetManifestResourceStream(args.Name) probably should be GetManifestResourceStream(string.Format("{0}.lib.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)) or GetManifestResourceStream(string.Format("{0}.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)). I don't know the reasons why but I've has to use either of these.

                      – mheyman
                      Mar 16 '12 at 16:35













                    • @mheyman - re: * I don't know the reasons why...*. it just depends on how you name the embedded resources when you compile the thing. You can use this to diagnose: cheeso.members.winisp.net/… (A tool that displays the names of the embedded resources in an assembly)

                      – Cheeso
                      May 16 '12 at 18:13






                    • 1





                      I'm assuming that code snippet should be put in a void Main(args) function for an exe, but where do we put this code if we're creating a class library?

                      – jtate
                      Jun 26 '17 at 15:28














                    55












                    55








                    55







                    ILMerge does merge assemblies, which is nice, but sometimes not quite what you want. For example, when the assembly in question is a strongly-named assembly, and you don't have the key for it, then you cannot do ILMerge without breaking that signature. Which means you have to deploy multiple assemblies.



                    As an alternative to ilmerge, you can embed one or more assemblies as resources into your exe or DLL. Then, at runtime, when the assemblies are being loaded, you can extract the embedded assembly programmatically, and load and run it. It sounds tricky but there's just a little bit of boilerplate code.



                    To do it, embed an assembly, just as you would embed any other resource (image, translation file, data, etc). Then, set up an AssemblyResolver that gets called at runtime. It should be set up in the static constructor of the startup class. The code is very simple.



                        static NameOfStartupClassHere()
                    {
                    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver);
                    }

                    static System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args)
                    {
                    Assembly a1 = Assembly.GetExecutingAssembly();
                    Stream s = a1.GetManifestResourceStream(args.Name);
                    byte block = new byte[s.Length];
                    s.Read(block, 0, block.Length);
                    Assembly a2 = Assembly.Load(block);
                    return a2;
                    }


                    The Name property on the ResolveEventArgs parameter is the name of the assembly to be resolved. This name refers to the resource, not to the filename. If you embed the file named "MyAssembly.dll", and call the embedded resource "Foo", then the name you want here is "Foo". But that would be confusing, so I suggest using the filename of the assembly for the name of the resource. If you have embedded and named your assembly properly, you can just call GetManifestResourceStream() with the assembly name and load the assembly that way. Very simple.



                    This works with multiple assemblies, just as nicely as with a single embedded assembly.



                    In a real app you're gonna want better error handling in that routine - like what if there is no stream by the given name? What happens if the Read fails? etc. But that's left for you to do.



                    In the rest of the application code, you use types from the assembly as normal.



                    When you build the app, you need to add a reference to the assembly in question, as you would normally. If you use the command-line tools, use the /r option in csc.exe; if you use Visual Studio, you'll need to "Add Reference..." in the popup menu on the project.



                    At runtime, assembly version-checking and verification works as usual.



                    The only difference is in distribution. When you deploy or distribute your app, you need not distribute the DLL for the embedded (and referenced) assembly. Just deploy the main assembly; there's no need to distribute the other assemblies because they're embedded into the main DLL or EXE.






                    share|improve this answer















                    ILMerge does merge assemblies, which is nice, but sometimes not quite what you want. For example, when the assembly in question is a strongly-named assembly, and you don't have the key for it, then you cannot do ILMerge without breaking that signature. Which means you have to deploy multiple assemblies.



                    As an alternative to ilmerge, you can embed one or more assemblies as resources into your exe or DLL. Then, at runtime, when the assemblies are being loaded, you can extract the embedded assembly programmatically, and load and run it. It sounds tricky but there's just a little bit of boilerplate code.



                    To do it, embed an assembly, just as you would embed any other resource (image, translation file, data, etc). Then, set up an AssemblyResolver that gets called at runtime. It should be set up in the static constructor of the startup class. The code is very simple.



                        static NameOfStartupClassHere()
                    {
                    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver);
                    }

                    static System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args)
                    {
                    Assembly a1 = Assembly.GetExecutingAssembly();
                    Stream s = a1.GetManifestResourceStream(args.Name);
                    byte block = new byte[s.Length];
                    s.Read(block, 0, block.Length);
                    Assembly a2 = Assembly.Load(block);
                    return a2;
                    }


                    The Name property on the ResolveEventArgs parameter is the name of the assembly to be resolved. This name refers to the resource, not to the filename. If you embed the file named "MyAssembly.dll", and call the embedded resource "Foo", then the name you want here is "Foo". But that would be confusing, so I suggest using the filename of the assembly for the name of the resource. If you have embedded and named your assembly properly, you can just call GetManifestResourceStream() with the assembly name and load the assembly that way. Very simple.



                    This works with multiple assemblies, just as nicely as with a single embedded assembly.



                    In a real app you're gonna want better error handling in that routine - like what if there is no stream by the given name? What happens if the Read fails? etc. But that's left for you to do.



                    In the rest of the application code, you use types from the assembly as normal.



                    When you build the app, you need to add a reference to the assembly in question, as you would normally. If you use the command-line tools, use the /r option in csc.exe; if you use Visual Studio, you'll need to "Add Reference..." in the popup menu on the project.



                    At runtime, assembly version-checking and verification works as usual.



                    The only difference is in distribution. When you deploy or distribute your app, you need not distribute the DLL for the embedded (and referenced) assembly. Just deploy the main assembly; there's no need to distribute the other assemblies because they're embedded into the main DLL or EXE.







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Sep 9 '10 at 13:02

























                    answered Mar 9 '09 at 5:27









                    CheesoCheeso

                    134k73404633




                    134k73404633













                    • Wow I never thought of doing that... to be honest I'm surprised it works.

                      – devios1
                      Jul 31 '10 at 18:55











                    • That's pretty nifty.

                      – spender
                      Dec 8 '10 at 1:40











                    • The GetManifestResourceStream(args.Name) probably should be GetManifestResourceStream(string.Format("{0}.lib.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)) or GetManifestResourceStream(string.Format("{0}.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)). I don't know the reasons why but I've has to use either of these.

                      – mheyman
                      Mar 16 '12 at 16:35













                    • @mheyman - re: * I don't know the reasons why...*. it just depends on how you name the embedded resources when you compile the thing. You can use this to diagnose: cheeso.members.winisp.net/… (A tool that displays the names of the embedded resources in an assembly)

                      – Cheeso
                      May 16 '12 at 18:13






                    • 1





                      I'm assuming that code snippet should be put in a void Main(args) function for an exe, but where do we put this code if we're creating a class library?

                      – jtate
                      Jun 26 '17 at 15:28



















                    • Wow I never thought of doing that... to be honest I'm surprised it works.

                      – devios1
                      Jul 31 '10 at 18:55











                    • That's pretty nifty.

                      – spender
                      Dec 8 '10 at 1:40











                    • The GetManifestResourceStream(args.Name) probably should be GetManifestResourceStream(string.Format("{0}.lib.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)) or GetManifestResourceStream(string.Format("{0}.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)). I don't know the reasons why but I've has to use either of these.

                      – mheyman
                      Mar 16 '12 at 16:35













                    • @mheyman - re: * I don't know the reasons why...*. it just depends on how you name the embedded resources when you compile the thing. You can use this to diagnose: cheeso.members.winisp.net/… (A tool that displays the names of the embedded resources in an assembly)

                      – Cheeso
                      May 16 '12 at 18:13






                    • 1





                      I'm assuming that code snippet should be put in a void Main(args) function for an exe, but where do we put this code if we're creating a class library?

                      – jtate
                      Jun 26 '17 at 15:28

















                    Wow I never thought of doing that... to be honest I'm surprised it works.

                    – devios1
                    Jul 31 '10 at 18:55





                    Wow I never thought of doing that... to be honest I'm surprised it works.

                    – devios1
                    Jul 31 '10 at 18:55













                    That's pretty nifty.

                    – spender
                    Dec 8 '10 at 1:40





                    That's pretty nifty.

                    – spender
                    Dec 8 '10 at 1:40













                    The GetManifestResourceStream(args.Name) probably should be GetManifestResourceStream(string.Format("{0}.lib.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)) or GetManifestResourceStream(string.Format("{0}.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)). I don't know the reasons why but I've has to use either of these.

                    – mheyman
                    Mar 16 '12 at 16:35







                    The GetManifestResourceStream(args.Name) probably should be GetManifestResourceStream(string.Format("{0}.lib.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)) or GetManifestResourceStream(string.Format("{0}.{1}.dll", typeof(Foo).Namespace, new AssemblyName(args.Name).Name)). I don't know the reasons why but I've has to use either of these.

                    – mheyman
                    Mar 16 '12 at 16:35















                    @mheyman - re: * I don't know the reasons why...*. it just depends on how you name the embedded resources when you compile the thing. You can use this to diagnose: cheeso.members.winisp.net/… (A tool that displays the names of the embedded resources in an assembly)

                    – Cheeso
                    May 16 '12 at 18:13





                    @mheyman - re: * I don't know the reasons why...*. it just depends on how you name the embedded resources when you compile the thing. You can use this to diagnose: cheeso.members.winisp.net/… (A tool that displays the names of the embedded resources in an assembly)

                    – Cheeso
                    May 16 '12 at 18:13




                    1




                    1





                    I'm assuming that code snippet should be put in a void Main(args) function for an exe, but where do we put this code if we're creating a class library?

                    – jtate
                    Jun 26 '17 at 15:28





                    I'm assuming that code snippet should be put in a void Main(args) function for an exe, but where do we put this code if we're creating a class library?

                    – jtate
                    Jun 26 '17 at 15:28











                    7














                    You can embed an assembly (or any file, actually) as a resource (and then use the ResourceManager class to access them), but if you just want to combine assemblies, you're better off using a tool like ILMerge.



                    EXE and DLL files are Windows portable executables, which are generic enough to accomodate future types of code, including any .NET code (they can also run in DOS but only display a message saying that they're not supposed to run in DOS). They include instructions to fire up the .NET runtime if it isn't already running. It's also possible for a single assembly to span across multiple files, though this is hardly ever the case.






                    share|improve this answer




























                      7














                      You can embed an assembly (or any file, actually) as a resource (and then use the ResourceManager class to access them), but if you just want to combine assemblies, you're better off using a tool like ILMerge.



                      EXE and DLL files are Windows portable executables, which are generic enough to accomodate future types of code, including any .NET code (they can also run in DOS but only display a message saying that they're not supposed to run in DOS). They include instructions to fire up the .NET runtime if it isn't already running. It's also possible for a single assembly to span across multiple files, though this is hardly ever the case.






                      share|improve this answer


























                        7












                        7








                        7







                        You can embed an assembly (or any file, actually) as a resource (and then use the ResourceManager class to access them), but if you just want to combine assemblies, you're better off using a tool like ILMerge.



                        EXE and DLL files are Windows portable executables, which are generic enough to accomodate future types of code, including any .NET code (they can also run in DOS but only display a message saying that they're not supposed to run in DOS). They include instructions to fire up the .NET runtime if it isn't already running. It's also possible for a single assembly to span across multiple files, though this is hardly ever the case.






                        share|improve this answer













                        You can embed an assembly (or any file, actually) as a resource (and then use the ResourceManager class to access them), but if you just want to combine assemblies, you're better off using a tool like ILMerge.



                        EXE and DLL files are Windows portable executables, which are generic enough to accomodate future types of code, including any .NET code (they can also run in DOS but only display a message saying that they're not supposed to run in DOS). They include instructions to fire up the .NET runtime if it isn't already running. It's also possible for a single assembly to span across multiple files, though this is hardly ever the case.







                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered Oct 21 '08 at 17:11









                        Mark CidadeMark Cidade

                        84.4k29205225




                        84.4k29205225























                            5














                            Note ILMerge doesn't work with embedded resources like XAML, so WPF apps etc will need to use Cheeso's method.






                            share|improve this answer




























                              5














                              Note ILMerge doesn't work with embedded resources like XAML, so WPF apps etc will need to use Cheeso's method.






                              share|improve this answer


























                                5












                                5








                                5







                                Note ILMerge doesn't work with embedded resources like XAML, so WPF apps etc will need to use Cheeso's method.






                                share|improve this answer













                                Note ILMerge doesn't work with embedded resources like XAML, so WPF apps etc will need to use Cheeso's method.







                                share|improve this answer












                                share|improve this answer



                                share|improve this answer










                                answered May 13 '09 at 22:51









                                Richard DingwallRichard Dingwall

                                2,0992528




                                2,0992528























                                    4














                                    There's also the mkbundle utility offered by the Mono project






                                    share|improve this answer
























                                    • For the records: This only works for mono applications as also bundles the mono runtime. From the docs: Bundles merge your application, the libraries it uses and the Mono runtime into a single executable image. You can think of bundles as “statically linking mono” into your application.

                                      – CodeFox
                                      Sep 22 '15 at 4:12


















                                    4














                                    There's also the mkbundle utility offered by the Mono project






                                    share|improve this answer
























                                    • For the records: This only works for mono applications as also bundles the mono runtime. From the docs: Bundles merge your application, the libraries it uses and the Mono runtime into a single executable image. You can think of bundles as “statically linking mono” into your application.

                                      – CodeFox
                                      Sep 22 '15 at 4:12
















                                    4












                                    4








                                    4







                                    There's also the mkbundle utility offered by the Mono project






                                    share|improve this answer













                                    There's also the mkbundle utility offered by the Mono project







                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Oct 21 '08 at 17:19









                                    hovahova

                                    2,5081617




                                    2,5081617













                                    • For the records: This only works for mono applications as also bundles the mono runtime. From the docs: Bundles merge your application, the libraries it uses and the Mono runtime into a single executable image. You can think of bundles as “statically linking mono” into your application.

                                      – CodeFox
                                      Sep 22 '15 at 4:12





















                                    • For the records: This only works for mono applications as also bundles the mono runtime. From the docs: Bundles merge your application, the libraries it uses and the Mono runtime into a single executable image. You can think of bundles as “statically linking mono” into your application.

                                      – CodeFox
                                      Sep 22 '15 at 4:12



















                                    For the records: This only works for mono applications as also bundles the mono runtime. From the docs: Bundles merge your application, the libraries it uses and the Mono runtime into a single executable image. You can think of bundles as “statically linking mono” into your application.

                                    – CodeFox
                                    Sep 22 '15 at 4:12







                                    For the records: This only works for mono applications as also bundles the mono runtime. From the docs: Bundles merge your application, the libraries it uses and the Mono runtime into a single executable image. You can think of bundles as “statically linking mono” into your application.

                                    – CodeFox
                                    Sep 22 '15 at 4:12













                                    1














                                    Why do they use the same file format and/or file extension?





                                    Why should it be any different - it serves the same purpose!





                                    My 2¢ bit of clarification here: DLL is Dynamic Link Library. Both the old style .dll (C-code) and .net style .dll are by definition "dynamic link" libraries. So .dll is a proper description for both.






                                    share|improve this answer




























                                      1














                                      Why do they use the same file format and/or file extension?





                                      Why should it be any different - it serves the same purpose!





                                      My 2¢ bit of clarification here: DLL is Dynamic Link Library. Both the old style .dll (C-code) and .net style .dll are by definition "dynamic link" libraries. So .dll is a proper description for both.






                                      share|improve this answer


























                                        1












                                        1








                                        1







                                        Why do they use the same file format and/or file extension?





                                        Why should it be any different - it serves the same purpose!





                                        My 2¢ bit of clarification here: DLL is Dynamic Link Library. Both the old style .dll (C-code) and .net style .dll are by definition "dynamic link" libraries. So .dll is a proper description for both.






                                        share|improve this answer













                                        Why do they use the same file format and/or file extension?





                                        Why should it be any different - it serves the same purpose!





                                        My 2¢ bit of clarification here: DLL is Dynamic Link Library. Both the old style .dll (C-code) and .net style .dll are by definition "dynamic link" libraries. So .dll is a proper description for both.







                                        share|improve this answer












                                        share|improve this answer



                                        share|improve this answer










                                        answered Dec 10 '12 at 19:53









                                        EricEric

                                        1,1341912




                                        1,1341912























                                            0














                                            With respect to Cheeso's answer of embedding the assemblies as resources and loading them dynamically using the Load(byte) overload using an AssemblyResolve event handler, you need to modify the resolver to check the AppDomain for an existing instance of the Assembly to load and return the existing assembly instance if it's already loaded.



                                            Assemblies loaded using that overload do not have a context, which can cause the framework to try and reload the assembly multiple times. Without returning an already loaded instance, you can end up with multiple instances of the same assembly code and types that should be equal but won't be, because the framework considers them to be from two different assemblies.



                                            At least one way that multiple AssemblyResolve events will be made for the same assembly loaded into the "No context" is when you have references to types it exposes from multiple assemblies loaded into your AppDomain, as code executes that needs those types resolved.



                                            https://msdn.microsoft.com/en-us/library/dd153782%28v=vs.110%29.aspx



                                            A couple of salient points from the link:



                                            "Other assemblies cannot bind to assemblies that are loaded without context, unless you handle the AppDomain.AssemblyResolve event"



                                            "Loading multiple assemblies with the same identity without context can cause type identity problems similar to those caused by loading assemblies with the same identity into multiple contexts. See Avoid Loading an Assembly into Multiple Contexts."






                                            share|improve this answer




























                                              0














                                              With respect to Cheeso's answer of embedding the assemblies as resources and loading them dynamically using the Load(byte) overload using an AssemblyResolve event handler, you need to modify the resolver to check the AppDomain for an existing instance of the Assembly to load and return the existing assembly instance if it's already loaded.



                                              Assemblies loaded using that overload do not have a context, which can cause the framework to try and reload the assembly multiple times. Without returning an already loaded instance, you can end up with multiple instances of the same assembly code and types that should be equal but won't be, because the framework considers them to be from two different assemblies.



                                              At least one way that multiple AssemblyResolve events will be made for the same assembly loaded into the "No context" is when you have references to types it exposes from multiple assemblies loaded into your AppDomain, as code executes that needs those types resolved.



                                              https://msdn.microsoft.com/en-us/library/dd153782%28v=vs.110%29.aspx



                                              A couple of salient points from the link:



                                              "Other assemblies cannot bind to assemblies that are loaded without context, unless you handle the AppDomain.AssemblyResolve event"



                                              "Loading multiple assemblies with the same identity without context can cause type identity problems similar to those caused by loading assemblies with the same identity into multiple contexts. See Avoid Loading an Assembly into Multiple Contexts."






                                              share|improve this answer


























                                                0












                                                0








                                                0







                                                With respect to Cheeso's answer of embedding the assemblies as resources and loading them dynamically using the Load(byte) overload using an AssemblyResolve event handler, you need to modify the resolver to check the AppDomain for an existing instance of the Assembly to load and return the existing assembly instance if it's already loaded.



                                                Assemblies loaded using that overload do not have a context, which can cause the framework to try and reload the assembly multiple times. Without returning an already loaded instance, you can end up with multiple instances of the same assembly code and types that should be equal but won't be, because the framework considers them to be from two different assemblies.



                                                At least one way that multiple AssemblyResolve events will be made for the same assembly loaded into the "No context" is when you have references to types it exposes from multiple assemblies loaded into your AppDomain, as code executes that needs those types resolved.



                                                https://msdn.microsoft.com/en-us/library/dd153782%28v=vs.110%29.aspx



                                                A couple of salient points from the link:



                                                "Other assemblies cannot bind to assemblies that are loaded without context, unless you handle the AppDomain.AssemblyResolve event"



                                                "Loading multiple assemblies with the same identity without context can cause type identity problems similar to those caused by loading assemblies with the same identity into multiple contexts. See Avoid Loading an Assembly into Multiple Contexts."






                                                share|improve this answer













                                                With respect to Cheeso's answer of embedding the assemblies as resources and loading them dynamically using the Load(byte) overload using an AssemblyResolve event handler, you need to modify the resolver to check the AppDomain for an existing instance of the Assembly to load and return the existing assembly instance if it's already loaded.



                                                Assemblies loaded using that overload do not have a context, which can cause the framework to try and reload the assembly multiple times. Without returning an already loaded instance, you can end up with multiple instances of the same assembly code and types that should be equal but won't be, because the framework considers them to be from two different assemblies.



                                                At least one way that multiple AssemblyResolve events will be made for the same assembly loaded into the "No context" is when you have references to types it exposes from multiple assemblies loaded into your AppDomain, as code executes that needs those types resolved.



                                                https://msdn.microsoft.com/en-us/library/dd153782%28v=vs.110%29.aspx



                                                A couple of salient points from the link:



                                                "Other assemblies cannot bind to assemblies that are loaded without context, unless you handle the AppDomain.AssemblyResolve event"



                                                "Loading multiple assemblies with the same identity without context can cause type identity problems similar to those caused by loading assemblies with the same identity into multiple contexts. See Avoid Loading an Assembly into Multiple Contexts."







                                                share|improve this answer












                                                share|improve this answer



                                                share|improve this answer










                                                answered Jan 14 '16 at 22:52









                                                user3447701user3447701

                                                313




                                                313























                                                    0














                                                    I would suggest you to try Costura.Fody. Just don't forget to Install-Package Fody before Costura.Fody (in order to get the newest Fody!)






                                                    share|improve this answer






























                                                      0














                                                      I would suggest you to try Costura.Fody. Just don't forget to Install-Package Fody before Costura.Fody (in order to get the newest Fody!)






                                                      share|improve this answer




























                                                        0












                                                        0








                                                        0







                                                        I would suggest you to try Costura.Fody. Just don't forget to Install-Package Fody before Costura.Fody (in order to get the newest Fody!)






                                                        share|improve this answer















                                                        I would suggest you to try Costura.Fody. Just don't forget to Install-Package Fody before Costura.Fody (in order to get the newest Fody!)







                                                        share|improve this answer














                                                        share|improve this answer



                                                        share|improve this answer








                                                        edited Nov 14 '18 at 9:36

























                                                        answered Nov 14 '18 at 6:33









                                                        Peter Kalef ' DidiSoftPeter Kalef ' DidiSoft

                                                        1,1221118




                                                        1,1221118






























                                                            draft saved

                                                            draft discarded




















































                                                            Thanks for contributing an answer to Stack Overflow!


                                                            • Please be sure to answer the question. Provide details and share your research!

                                                            But avoid



                                                            • Asking for help, clarification, or responding to other answers.

                                                            • Making statements based on opinion; back them up with references or personal experience.


                                                            To learn more, see our tips on writing great answers.




                                                            draft saved


                                                            draft discarded














                                                            StackExchange.ready(
                                                            function () {
                                                            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f222655%2fembedding-assemblies-inside-another-assembly%23new-answer', 'question_page');
                                                            }
                                                            );

                                                            Post as a guest















                                                            Required, but never shown





















































                                                            Required, but never shown














                                                            Required, but never shown












                                                            Required, but never shown







                                                            Required, but never shown

































                                                            Required, but never shown














                                                            Required, but never shown












                                                            Required, but never shown







                                                            Required, but never shown







                                                            Popular posts from this blog

                                                            Xamarin.iOS Cant Deploy on Iphone

                                                            Glorious Revolution

                                                            Dulmage-Mendelsohn matrix decomposition in Python