2011-07-07 13 views
5

私はSQLiteを含むC#で単一実行可能アプリケーションを作成しようとしています。 System.Data.SQLiteはアンマネージDLL(SQLite.Interop.dll)に依存しているため、ILMergeとマージすることはできません。System.Data.SQLiteを単一の実行可能プログラムにマージするにはどうすればよいですか?

System.Data.SQLiteをプロジェクトにバンドルすると、タグ付きDLLなしで単一実行可能アプリケーションを作成できますか?

+0

ような何か? – Serghei

+0

できません。あなたが言ったように、それは管理されていないDLLに依存します。アンマネージドdllは、単一の実行可能ファイルにマージすることはできません。 –

+1

@Sergheiインストーラでシステムの周りにDLLを作成すると、コードをバグフリーにすることが難しくなります。 1つの実行可能ファイルで、ユーザーが最新のバージョンを持っていることを知っている場合、ユーザーはそれを置き換えます。インストーラにすべての適切なDLLが含まれているかどうか、およびそれらがすべて置き換えられているかどうかは心配する必要はありません。また、わかりやすいアプリケーションを実行するためにウィザードを通過する必要がないのは、より優れたユーザーエクスペリエンスだと思います。 – spiffytech

答えて

4

埋め込みリソースとして実行可能ファイルにdllを含めることができます。その後、実行時に展開します(これは、dllを解凍するディレクトリに書き込み権限を持っていることを前提としています)。

、あなたのアプリケーションのインストールファイルを作成しないのはなぜ

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

メモリストリームからアセンブリをロードすることもできます。したがって、ディスクに書き込む必要はありません。 – bitbonk

+2

@bitbonk - アンマネージドアセンブリを参照する必要があるサードパーティのマネージアセンブリでは、どのように動作しますか?そのマネージドアセンブリがメモリから読み取るように設定されていない場合、それを使用することはできません。 –

+0

はい、そうです。関与していないDLLがあるとすぐに、この方法は機能しません。 – bitbonk

関連する問題