Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use an DLL load from Embed Resource?

I have a DLL >> System.Data.SQLite.dll

To use it in a normal way > just add it as reference and

using System.Data.SQLite;

then, I can use all the functions inside this DLL.

But, I want to merge my app.exe and this DLL into one single file. I have tried using ILmerge, but fail. As I know, ILmerge cannot merge unmanage DLL.

So, I tried another method > make the DLL as embbed resource. I am able to load it as an assembly with the below code:

Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApp.System.Data.SQLite.dll");
byte[] ba = null;
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
    int read;
    while ((read = stm.Read(buffer, 0, buffer.Length)) > 0)  
    {
        ms.Write(buffer, 0, read);
    }
    ba = ms.ToArray();
}
Assembly sSQLiteDLL = Assembly.Load(ba);

but, how am I going to use the functions in SQLiteDLL?

I also tried add the DLL as resource in properties and load it like this:

public Form1()
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    InitializeComponent();
}

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    AppDomain domain = (AppDomain)sender;
    if (args.Name.Contains("System_Data_SQLite"))
    {
        return domain.Load(MyApp.Properties.Resources.System_Data_SQLite);
    }
    return null;
}

The above explained what I've got so far and I don't know what to do next to use the DLL? I still can't use the functions inside the DLL.

For example, when I type this:

SQLiteCommand cmd = new SQLiteCommand();

The Visual Studio says:

Error 21 The type or namespace name 'SQLiteCommand' could not be found (are you missing a using directive or an assembly reference?)

Can you share your insight? Thanks.

like image 514
alont Avatar asked Feb 10 '12 13:02

alont


People also ask

What is DLL in embedded?

A dynamic link library (DLL) is a collection of small programs that larger programs can load when needed to complete specific tasks. The small program, called a DLL file, contains instructions that help the larger program handle what may not be a core function of the original program.

How do I insert a DLL into another DLL?

Add DLL As Embedded Resource First, add the DLL as Reference. Then, add the same DLL as file into the project. Right click the project's name > Add > Existing Item... The same DLL will exist twice in different folder in the project.

How do you add an embedded resource?

Open Solution Explorer add files you want to embed. Right click on the files then click on Properties . In Properties window and change Build Action to Embedded Resource . After that you should write the embedded resources to file in order to be able to run it.


1 Answers

You can embed an assembly AND reference it (in VS) at the same time... for the way you want to use it you need to reference it! Any reason you don't reference the Assembly ?

Using a Type from an embedded Assembly (managed) without referencing it is a bit harder but possible using Reflection etc. - see these links (they include reference material AND some sample code etc.):

  • http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
  • https://stackoverflow.com/a/57450/847363
  • http://msdn.microsoft.com/en-us/library/h538bck7.aspx (loads an ssembly from a byte array so there is no need to write that assembly to the filesystem)
  • http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettype.aspx
  • http://www.codeproject.com/Articles/32828/Using-Reflection-to-load-unreferenced-assemblies-a

On embedding managed DLLs you have several options:

  • use ILMerge (free)
    For howto see here and here

OR

  • use some tool like SmartAssembly (commercial)
    it can embed and merge among other things (no need to change your source code)

OR

  • code that yourself in less than 10 lines (free but minimal source code change)
    mark all needed dependencies as "embedded resource" - this way they are included in the EXE file... you need to setup an AssemblyResolve handler which at runtime reads from Resources and returns the needed DLLs to the .NET runtime...
like image 117
Yahia Avatar answered Oct 17 '22 10:10

Yahia