短編小説
共通言語ランタイムをサポートするX64プラットフォーム用のC++アプリケーションをコンパイルし、その中のネイティブsqliteライブラリを使用すると、アプリケーションがsqlite3MemRealloc内でクラッシュし、大量のメモリ(約5GB)を割り当てようとします。
同じアプリケーションがCLRサポートなしでコンパイルされた場合、必要な機能が機能し、この量のメモリを割り当てる試みは行われません。この事実を検証するための条件でブレークポイントを設定します。
データベース自体は800KBの小さなファイルであり、単純な「select*fromXYZ」クエリを実行しようとしています。コードベースにある既存のsqlite3.7.11と最新のsqlite3.7.14の両方で試してみました。
この問題は一貫しています。アプリケーションを再構築したり、いくつかの設定で遊んだりしても、CLRサポートがあるとクラッシュしますが、CLRサポートがないと機能します。
長い話
私は、C ++で記述された既存のコードベースのコードを活用するだけでなく、.NETFrameworkの機能も活用するアプリケーションを開発しようとしていました。
既存のコード(内部でsqliteを利用する)に対してリンクするC ++/CLIアプリケーションを作成しました。私のコードはsqliteを直接使用していません。sqliteを使用する既存のコードは、残りのコードベースが依存するネイティブC++ライブラリです。そのため、簡単に触れることができず、System.Data.Sqliteを単純に使用することはできません。
.NET Frameworkへのすべての依存関係を削除し、.NET Frameworkコードを使用せずに既存のネイティブコードのみを利用する単純なアプリケーションを作成し、CLRサポートの有無にかかわらず2回コンパイルすることで、この問題を切り分けました。