面向任何 CPU 的 C# 应用程序的 SQLite 配置 - 第一部分






3.90/5 (9投票s)
讨论了如何为 C# 应用程序配置文件夹结构,该应用程序使用 SQLite 数据库和 ADO.NET 程序集,并支持任何 CPU(无论 32 位还是 64 位)。第一部分是对项目文件夹结构的理论性考虑。第二部分将提供一个演示来验证此概念。
引言
SQLite 数据库非常轻量级,不依赖任何第三方产品或服务器。大量文章[2]-[5] 可以帮助您快速上手使用 SQLite 编写 Windows 应用程序。完成 Windows 应用程序后,您将面临一个问题:如何顺利地将应用程序部署到客户端计算机?如您所知,客户端计算机可以是 32 位或 64 位。如何让您的 Windows 应用程序在任何类型的 Windows 平台上运行,无论 32 位还是 64 位?
我在互联网上搜索并找到了一些关于这个主题的零散想法。所以在这里,我将相关内容整理成一篇易于理解的文章。
哪个版本的 ADO.NET?
根据参考[1],我们需要决定下载正确类型的二进制包,因为我们将考虑如何将应用程序部署到客户机。我们的决策过程将经历以下步骤。
名称中不包含“static”的所有程序包都需要在目标计算机上安装适当版本的 Microsoft Visual C++ 运行时库才能成功。名称中包含“setup”的可下载程序包已包含并会尝试自动安装所需的 Microsoft Visual C++ 运行时库。这意味着安装程序将在目标计算机上执行更多工作。因此,我们寻找名称中包含“static”的程序包。
我们将下载“static”程序包,因为这些程序集二进制文件会静态链接到相应版本的 Visual C++ 运行时。当您的应用程序部署到客户机时,您不能假定客户机已安装了必要版本的 Visual C++ 运行时,因为客户可能没有足够的权限。
我们不会考虑“Bundle”程序包,因为它旨在将程序集部署到全局程序集缓存 (GAC) 文件夹。
我们还需要确定应用程序所针对的 .NET Framework 的版本。目前我使用 Visual Studio 2015,应用程序针对 .NET Framework 4.5,但客户机可能没有安装 .NET 4.5 Framework。为确保安全,我们可以下载针对 .NET Framework 4.0 的静态链接程序包,但根据指南:强烈建议选择与目标 .NET Framework 版本匹配的程序包,我们决定选择针对 .NET Framework 4.5 的版本。
根据 [1],我们知道程序集 System.Data.SQLite.dll 是仅托管的核心程序集,而程序集 SQLite.Interop.dll 是本机互操作程序集(x32 或 x64)。
如果我们将 C# 应用程序构建为 x86 程序集,然后在 x64 Windows 计算机上运行它。我们会遇到一个问题。在客户/目标 64 位计算机上,由于启动进程的可执行文件完全由托管代码组成,它将以机器的原生处理器架构运行,在 x64 机器上就是 x64。稍后,这将导致为 x86 编译的任何本机代码(例如“System.Data.SQLite.dll”混合模式程序集,“SQLite.Interop.dll”本机互操作程序集或“sqlite3.dll”本机库)的程序集加载失败,通常会根据 [1] 引发 BadImageFormatException。
对于这种 x86 构建方案,我们将使用本机库预加载功能,该功能自 1.0.80.0 版本起可用,并且默认启用。
决定
基于以上原因,如果我们希望我们的应用程序支持任何 CPU,我们将同时使用以下两个程序包:
- sqlite-netFx45-static-binary-Win32-2012-1.0.101.0.zip(包含 x86 版本的 System.Data.SQLite.dll 和 SQLite.Interop.dll)
- sqlite-netFx45-static-binary-x64-2012-1.0.101.0.zip(包含 x86 版本的 System.Data.SQLite.dll 和 SQLite.Interop.dll)
项目文件夹结构
基于以上考虑,我们将使用 XCOPY 将应用程序部署到目标机器,文件结构如下:
\App.exe(必需,仅托管的应用程序可执行程序集) \App.dll(可选,仅托管的应用程序库程序集) \x86\System.Data.SQLite.dll(必需,x86 仅托管的核心程序集,来自程序包 1) \x86\SQLite.Interop.dll(必需,x86 本机互操作程序集,来自程序包 1) \x64\System.Data.SQLite.dll(必需,x64 仅托管的核心程序集,来自程序包 2) \x64\SQLite.Interop.dll(必需,x64 本机互操作程序集,来自程序包 2)
关注点
在第一部分,我提出了一个文件结构。在下一篇文章中,我将提供一个演示来验证这个概念。如果您有更好的想法,请与 CodeProject 社区成员分享。
感谢阅读这篇文章。
参考
- System.Data.SQLite 下载
- 在 Windows 上安装和使用 SQLite
- C# & SQLite 1007000
- 在 C# 应用程序中使用 SQLite
- WinForms | WPF:使用 SQLite 数据库
- 如何将 SQLite 数据库与 C# 一起使用
- 在 C# 中使用 SQLite
- SQLite 入门 (C#)
- 如何在 Windows 应用程序中使用和连接到 SQLite
- SQLite 教程
- SQLite 和 C# 入门
- 如何在 C# 中创建和连接到 SQLite 数据库
- 便携式数据库:在 .NET 中使用 SQLite
- 入门,在 .NET 中使用 SQLite
历史
- 2016-04-11。初始化文章。
- 2016-04-16。更新了引言和参考部分。
- 2016-04-30。完成了文章。