短篇小说
当为具有公共语言运行时支持的 X64 平台编译 C++ 应用程序并使用其中的本机 sqlite 库时,应用程序在 sqlite3MemRealloc 内崩溃,试图分配大量内存(大约 5GB)。
当在没有 CLR 支持的情况下编译相同的应用程序时,所需的功能会起作用,并且不会尝试分配此数量的内存。我设置了一个带有条件的断点来验证这个事实。
数据库本身是一个 800KB 的小文件,我们正在尝试运行一个简单的“select * from XYZ”查询。使用我们代码库中现有的 sqlite 3.7.11 和最新的 sqlite 3.7.14 进行了尝试。
这个问题是一致的。无论我重建应用程序或使用某些设置多少次 - 在 CLR 支持下它会崩溃,在没有 CLR 支持的情况下它可以工作。
更长的故事
我试图开发一个应用程序,该应用程序利用现有的用 C++ 编写的代码库中的代码,但也利用了 .NET 框架的强大功能。
我创建了一个 C++/CLI 应用程序,该应用程序链接到现有代码(在其中使用 sqlite)。我的代码不直接使用 sqlite。使用 sqlite 的现有代码是其余代码库所依赖的本机 C++ 库。所以我不能轻易触摸它,因此不能简单地使用 System.Data.Sqlite。
我通过删除对 .NET 框架的所有依赖项并创建一个简单的应用程序来隔离这个问题,该应用程序只使用现有的本机代码而不使用任何 .NET 框架代码,并编译两次 - 有和没有 CLR 支持。