2011-07-07 20 views
5

Estoy tratando de crear una aplicación ejecutable en C#, que incluye SQLite. System.Data.SQLite depende de una DLL no administrada (SQLite.Interop.dll), por lo que no puedo fusionarla con ILMerge.¿Cómo puedo fusionar System.Data.SQLite en un solo programa ejecutable?

¿Cómo puedo agrupar System.Data.SQLite en mi proyecto para que pueda generar una aplicación ejecutable de manera única sin archivos DLL etiquetables?

+0

¿Por qué no hacer un archivo de instalación para su aplicación? – Serghei

+0

No puedes. Como dijiste, depende de una dll no administrada. Los dlls no administrados no se pueden fusionar en un único ejecutable. –

+1

@Serghei Tener un instalador arrojado DLLs alrededor del sistema hace que sea más difícil hacer que su código libre de errores. Con un ejecutable, si el usuario lo reemplaza, sabe que tiene la última versión. No hay que preocuparse si el instalador incluye todos los archivos DLL correctos y si los reemplazó a todos. Además, creo que es una mejor experiencia de usuario para no tener que pasar por un asistente para ejecutar mi aplicación trivial. – spiffytech

Respuesta

4

Puede incluir el dll como un recurso incrustado en el ejecutable, luego en tiempo de ejecución extraerlo (esto supone que el programa tiene permisos para escribir en el directorio al que está extrayendo el dll).

Algo así como

string sqllitefile = "sqllite.dll"; 
Assembly currentAssembly = Assembly.GetExecutingAssembly(); 

using (FileStream fs = fileInfoOutputFile.OpenWrite()) 
using (Stream resourceStream =currentAssembly.GetManifestResourceStream(sqllitefile)) 
{ 
    const int size = 4096; 
    byte[] bytes = new byte[4096]; 
    int numBytes; 
    while ((numBytes = resourceStream.Read(bytes, 0, size)) > 0) 
    { 
     fs.Write(bytes, 0, numBytes); 
    } 
    fs.Flush(); 
    fs.Close(); 
    resourceStream.Close(); 
} 
+0

También es posible cargar un conjunto desde una secuencia de memoria. Entonces no tienes que escribirlo en el disco. – bitbonk

+2

@ bitbonk: ¿cómo funcionaría eso con un ensamblado administrado por un tercero que necesita hacer referencia al ensamblado no administrado (como se está hablando de la pregunta)? Si ese ensamblaje administrado no está configurado para leerlo desde la memoria, no podrá usarlo. –

+0

Sí, tiene razón, tan pronto como haya DLL sin gestionar involucradas, este enfoque no funciona. – bitbonk

Cuestiones relacionadas