2012-02-10 14 views
9

Tengo una DLL >>System.Data.SQLite.dllCómo usar una carga de DLL desde el recurso de inserción?

Para usarlo de una manera normal> simplemente agregarlo como referencia y

using System.Data.SQLite; 

entonces, puedo usar todas las funciones dentro de esta DLL.

Pero, quiero fusionar mi app.exe y esta DLL en un solo archivo. He intentado usar ILmerge, pero falla. Como sé, ILmerge no puede fusionar una DLL no administrada.

Por lo tanto, probé otro método> hacer que la DLL sea un recurso incrustado. soy capaz de cargarlo como un conjunto con el código de abajo:

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); 

pero, ¿cómo voy a usar las funciones de SQLiteDLL?

También probé añadir el archivo DLL como de recursos en propiedades y cargarlo como esto:

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; 
} 

Lo anterior se explica lo que tengo hasta ahora y no sé qué hacer a continuación para utilizar el ¿DLL? Todavía no puedo usar las funciones dentro de la DLL.

Por ejemplo, cuando escribo esto:

SQLiteCommand cmd = new SQLiteCommand(); 

El Visual Studio dice:

Error 21 El tipo o espacio de nombres 'SQLiteCommand' no se pudo encontrar (¿falta una directiva using o una referencia de montaje?)

¿Puede compartir su conocimiento? Gracias.

+2

Debería poder combinar los métodos que tiene arriba para lograr esto. Sin embargo, requiere que el ensamblado de SQLite se agregue como referencia, de lo contrario, VS no puede saber qué hacer con él. Sin embargo, no estoy seguro de cómo resuelve este problema DLL nativo. Todavía lo necesitará como un archivo físico en tiempo de ejecución. –

+0

Has hecho una pregunta muy similar y has recibido muchas respuestas, incluidos algunos enlaces, etc. ¿has registrado estas respuestas/enlaces? – Yahia

+0

@Yahia: estudiar ... tomará un tiempo. He intentado SmartAssembly y sí, éxito. No se puede usar ** ILmerge **. Tal vez pierda algunos parámetros. Para ** ILmerge **, los parámetros que utilicé son: 'ilmerge /out:MyApp2.exe MyApp.exe System.Data.SQLite.dll' Se produjo un error, dice que el ensamblado ** System.Data.SQLite.dll ** no está marcado como que contiene solo código administrado. Ahora intentaré fusionar manualmente la DLL dentro del código. Te dejaré saber si el éxito. y oye, gracias por tu ayuda. Verdaderamente apreciado. – alont

Respuesta

4

Puede incrustar un conjunto Y hacer referencia (en VS) al mismo tiempo ... para la forma en que desea utilizarlo, ¡debe hacer referencia a él! ¿Alguna razón por la que no hace referencia a la Asamblea?

Usar un tipo desde un ensamblado integrado (administrado) sin hacer referencia a él es un poco más difícil pero posible al usar Reflection, etc. - vea estos enlaces (incluyen material de referencia Y algunos ejemplos de código, etc.):

Al incrustar archivos DLL administrados tiene varias opciones:

O

  • utilizan alguna herramienta como SmartAssembly (comercial)
    puede integrar y combinar entre otras cosas (no es necesario cambiar el código fuente)

O

  • code that yourself in less than 10 lines (cambio de forma gratuita, pero el mínimo código fuente)
    marca de todas las dependencias necesarias como "recurso incrustado" - de esta manera que se incluyen en el archivo EXE ... Necesita configurar un controlador AssemblyResolve que en el tiempo de ejecución lee desde Recursos y devuelve las DLL necesarias al .NET runtime ...
+1

Hola, Yahia, después de algunos éxitos en algunos proyectos. He decidido escribir un tutorial para esto. Leer más: [link] (http://www.codeproject.com/Articles/528178/Load-DLL-From-Embedded-Resource) – alont

+0

@alont muy agradable :-) – Yahia

+0

muchas gracias. {estrechar la mano} :) – alont

0

Este no es un método para usar ensamblajes cargados en AppDomain. Lea este artículo: How to: Load Assemblies into an Application Domain

En resumen, debe llamar a GetMethod() con el nombre del método (por ejemplo, SqlCommand) y luego llamarlo a través del método .Invoke().

Cuestiones relacionadas