【发布时间】:2012-12-10 15:34:46
【问题描述】:
短篇小说
在为支持公共语言运行时的 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 支持。
【问题讨论】:
-
哎哟。崩溃是否取决于数据库的内容?您是否尝试过仅使用
/clr编译几个文件以尝试缩小问题发生的范围? -
是的,我尝试使用 /clr 仅编译所需的文件。还是一样。关于依赖性 - 我想它确实依赖于它,但我无法隔离问题。我尝试了我们公司的许多数据库,但仍然发生。数据库本身是由公司的另一个部门创建的,我无法控制。
标签: visual-c++ sqlite c++-cli clr