1

我将 Visual Studio 2012 用于典型的 LOB 应用程序。这个应用程序有 DAL、BLL 和 UI 层。

除 Sqlite 外,所有项目都基于可移植类库 (PCL),因此我可以编译一次,它们适用于所有平台。

但是数据库是Sqlite。Sqlite 使用的是原生代码,所以我需要为每个平台部署一个包。例如,当我需要为ARM处理器部署时,我需要为ARM重新编译所有项目(超过20个),因为Sqlite放在较低层。大多数项目直接或间接依赖于放置 Sqlite 的 DAL。

哪种方法是解决这种情况的最佳方法?

谢谢

4

2 回答 2

3

看看这个关于 SQLite for .NET的网页。

有一个独立于平台的 SQLite.dll 版本。它将动态加载具有特定于平台的本机代码的附加 DLL。他们提出了以下目录布局(在您的应用程序目录中):

System.Data.SQLite.dll (required, managed-only core assembly)
System.Data.SQLite.Linq.dll (optional, managed-only LINQ assembly)
x86\SQLite.Interop.dll (required, x86 native interop assembly)
x64\SQLite.Interop.dll (required, x64 native interop assembly)

在您的项目中,您只需添加独立于平台、仅托管的 DLL。出于这个原因,您可以编译一次,它应该可以在所有平台上运行。仅托管到本机 DLL 之间没有硬链接。这仅在运行时解决。

希望这种方法可以扩展到 ARM 架构。

请注意,该页面还包含混合模式程序集、针对某些 VC 运行时库动态链接的程序集等。您需要避免使用它们。它们会引起很多头痛。

于 2012-12-30T09:56:49.240 回答
1

一旦您在应用程序中包含原生库,您就需要为每个平台构建一个单独的包,以便每个平台都包含适用于该平台的正确库。

如果您尚未将SQLite 用于 Windows 运行时 Visual Studio 扩展,那么您应该这样做。它将 SQLite 作为扩展添加到您的添加引用对话框。如果您从那里将其添加到您的项目中,则每次构建时都会自动包含正确项目的本机库。

要从 .NET 访问本机库,您可以使用独立于平台的 sqlite-net

由于您使用的是 PCL,因此您可能不是仅为 WinRT 编写应用程序。在这种情况下,答案可能并不完全适用,但我需要更多信息才能为您提供更具体的建议。

于 2012-12-31T07:46:02.183 回答