ちょっとした宣伝:
NuGet パッケージマネージャを使う場合については、別途
の記事にまとめている。以下、本題。
メモ: | 内容が 2012 年当時のものなので、 引用元の文章がすでになくなっていたりするが、 内容的には問題ないはずだ。 |
System.Data.SQLite を導入する
SQLite の ADO.NET アダプタである、System.Data.SQLite。
単なるラッパではなく、SQLite 自体もパッケージに持っているので、別途 SQLite をパッケージに含めなくても良いのが利点。
しかも、ライセンスが Public Domain であるのが、非常に使い勝手が良い。
注意: |
詳しくは System.Data.SQLite の 著作権表記 を読んでほしいが、"System.Data.SQLite.Linq" と "System.Data.SQLite.EF6" については、ソースコードの一部が Ms-PL ライセンスとなっている。 Ms-PL ライセンスとなっている SQL Generation ディレクトリ のソースは、public domain と明示されているものをのぞくと、すべて copyright (c) Microsoft Corporation と書いてある。 ビルド済みバイナリには Microsoft の著作権表記などが出てこないため、バイナリ配布であれば Public Domain と書かれたライセンスに従えば良いので、特に何も気にする必要はなさそうだ。 ソースコードを配布する場合は、上記ソースコード先頭などに書かれているの著作権表記等の部分をそのまま消さずに表示しなくてはならない点に注意すべきだろう。
|
さて、いざ使おうとダウンロードページに飛ぶと、それはもうすごい数のパッケージが配布されている。
http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
しかし慌てるな。長々と英語で説明が書いてあるが、そんなに難しいことは言っていない。
だいたい、ダウンロードページの頭か、 FAQ のページ に書かれている。
パッケージの種類
さて、まず最初の違いは、
- ソースパッケージ
- セットアップパッケージ
- バイナリパッケージ
の3種類だ。
ソースは言わずもがなだが、セットアップ版とバイナリ版の違いは?というと、
- The setup packages are intended to be installed only on developer machines and then only when the design-time components for Visual Studio are required. In theory, they can be installed on customer machines as well; however, this type of deployment is not recommended.
とあるように、「design-time components」が必要な場合だけ、セットアップ版を使用しろと書いてある。
データベースエクスプローラで表示させたり、Entity Framework のデータソースとして使用したり、とにかく IDE と連動させたいときはセットアップ版をインストールし、単にライブラリを使いたいだけならバイナリ版を落としてきて参照させれば良い。
対象プラットフォームの違い
次の違いは「プラットフォームターゲット」(VBだと 「ターゲット CPU」とも)。
- x86
- x64
自分の OS が 64bit だと、つい x64 を選んでしまいそうになるが、それだとビルドしたアセンブリが 32bit OS で動かない。
例えば Any CPU 設定のプロジェクトにしていた場合、x86 アセンブリを参照して実行したときに OS が x64 であったときや、その逆の時に動かなくなってしまう。
とくに VS2008 までは、標準のビルドターゲットが AnyCPU になっているので注意が必要だ。VC# 2010 Express などでは、もともと x86 しか選べないので、そのままでも問題ない。
特に事情が無ければ x86 を選んで、自分のプロジェクトのプラットフォームターゲットも x86 としておけば問題ないだろう。
どうしても Any CPU で動かしたい場合は、次項ででてくる bundle 版 でない方 を選んで、 x86, x64 両方の DLL を含めるようにする。
アセンブリの違い
次の違いは「bundle」版か否か。
System.Data.SQLite の sqlite 接続部分は、アンマネージドコードで書かれている。このアンマネージドコード部分もひとつのアセンブリに含まれている .NET アセンブリのことを mixed-mode と呼ぶ。
System.Data.SQLite.dll にこのアンマネージドコード含まれているのが bundle 版で、マネージドコードと、アンマネージドコードが分かれているのが、bundle 版でないほうだ。
bundle 版の方は x86 用と x64 用が明確に分かれているので、自分のプロジェクトを Any CPU としている場合には使えない。
bundle 版でない方は、System.Data.SQLite.dll が x86, x64 で共通なので、プロジェクトからはそちらを参照しておいて、アンマネージドコードが入っている SQLite.Interop.dll を以下の様に配置すれば、両方のプラットフォームに対応できる。
- <bin>\App.exe (optional, managed-only application executable assembly)
- <bin>\App.dll (optional, managed-only application library assembly)
- <bin>\System.Data.SQLite.dll (required, managed-only core assembly)
- <bin>\System.Data.SQLite.Linq.dll (optional, managed-only LINQ assembly)
- <bin>\x86\SQLite.Interop.dll (required, x86 native interop assembly)
- <bin>\x64\SQLite.Interop.dll (required, x64 native interop assembly)
このとき、ビルドされるときに SQLite.Interop.dll が出力アセンブリのフォルダにコピーされてしまうと困るので、ソリューションエクスプローラの参照アセンブリ一覧には加えずに、手動で上記配置にコピーするようにしておくと良い。
対象フレームワークの違い
おつぎは「.NET Framework」のバージョン。
これは、自分のプロジェクトのターゲットフレームワークが、 .NET Framework 4.0 以上か、それ未満かで選べば良い。
ちなみに、プロジェクトが .NET Framework 2.0 だったとしても、Linq を使わなければ 「(.NET Framework 3.5 SP1)」と書かれている System.Data.SQLite のアセンブリを使うことができる。
アンマネージドコードのラインタイムライブラリのリンク方法の違い
sqlite のアンマネージドコード部分は、Visual C++ でビルドされているそうで、実行には Visual C++ の該当バージョンのランタイムが必要だ。
そのラインタイムをスタティックリンクしてしまい、インストール不要としているのが、Statically-Linked Binaries であり、そうでないものは Visual C++ のラインタイムライブラリのインストールされている PC でしか動かない。
おわりに
さて、これでどれを導入したら良いか決められただろうか?
これらのいろいろな条件の組み合わせごとにダウンロードパッケージが存在するので、このように大量のパッケージが公開される自体になっている。
長々と説明されたところで、「結局どれを落とせばいいんだよ」ということになるだろう。
大丈夫。ダウンロードページには要約がまとめられている。
To summarize the above:
- Using XCOPY deployment in conjunction with the native library pre-loading feature, especially for customer machines, is highly recommended.
- Using the Global Assembly Cache (at all) is not recommended; therefore, the "bundle" packages should be avoided unless deemed absolutely necessary.
- Using the "static" assembly binaries on development machines is not recommended; therefore, the "static" packages should be avoided if all the target machines already have the Visual C++ runtime installed or it can be easily deployed beforehand.
- Choosing the package matching the version of the .NET Framework being targeted is highly recommended.
- Choosing the package matching the target processor architecture (for both development and customer machines) is almost certainly required for proper operation. Using the native library pre-loading feature should help with this.
だいぶ意訳しつつ少し細くを付け加えるとこんな感じ。(解釈間違ってるかも)
- 配布アセンブリと同じフォルダに SQLite.dll を配置する配布方法が強く推奨される。顧客に SQLite を事前にインストールさせるのを求めるのは良くない。
- setup 版を使ったとしても、リンクする際は binary パッケージでダウンロードした DLL を使え。
- GAC の登録前提とするのは推奨されない。GAC の登録がどうしても必要なら bundle版 にする必要があるが、そうでなければ bundle版 を使用するべきでない。
- よくわからなければ、 アプリケーションのリンクに bundle版を選ぶな。 bundle版を選ぶべきなのはデザイナーを使うために開発機PCにセットアップ版をインストールするときだけ。
- 開発機では static アセンブリの使用は推奨されない。(たぶん、リリース版がリンクされてしまうからだろう)
- 配布時に関しては特に言及されていないが、使用する PC に VC++ のランタイムライブラリをインストールさせるのが面倒なら、 static の方を使うと良いようだ。
- プロジェクトのターゲット .NET Framework のバージョンと一致させることが高く推奨される。
- .NET 2.0 ~ 3.5 → .NET 3.5 版
- .NET 4 → .NET 4.0 版
- .NET 4.5 → .NET 4.5 版
- .NET 4.5.1 → .NET 4.5.1 版
- .NET 4.6 ~ → .NET 4.6 版
- よくわからなければ、プロジェクトも、ライブラリも x86 版を選んでおけ。
最後に、 NuGet が使えるのならば、 NuGet パッケージマネージャに任せる のが一番だ。
ところで、
に、 Microsoft.Data.Sqlite + Entity Framework Core を使った場合についても記事にした。マイグレーションに対応していたり、生成される SQL コードがより効率的になっているといった利点もあるので、 Entity Framework を使うつもりで、 且つ、 ターゲットフレームワークを .NET 4.5.1 以降にできるのであれば、こちらも参考になるかもしれない。
ピンバック: windowsアプリでSQLiteの使用 | C# Visual Studio 2013 │ デザインが苦手なWeb便利屋
ピンバック: System.Data.SQLite の NuGet パッケージ のうち どれをインストールするべきか | Aqua Ware つぶやきブログ
ピンバック: windowsアプリでSQLiteの使用 | C# | PG-fan
まさに download page で「どれにすればいいんだーーー」状態になったので、とても助かりました。いい記事をありがとうございます。
バンドル版でGAC登録を行わないと、ADO.NET Entity Frameworkを使って、VS上でエンティティのビジュアル編集が出来ないです。配布方法は上記でOKですが、開発時は素直にバンドル版を(x86/x64両方とも)インストールした方が、面倒がありません。
ちなみにそれが 「design-time components」が必要な場合 に当たると思います。
セットアップ版をいんすとーるすれば、GAC 登録されますよね。
参考にさせていたきました。違いがとてもわかりやすかったです。
素晴らしい記事をありがとうございます。