65.9K
CodeProject 正在变化。 阅读更多。
Home

为 SQL Compact 创建私有安装

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (30投票s)

2009年2月25日

CPOL

9分钟阅读

viewsIcon

144196

downloadIcon

2603

本文讨论了如何为 SQL Compact 创建私有安装。

引言

本文是一个非常简单的“操作指南”,逐步介绍如何创建SQL Server Compact Edition的私有安装。

该过程是为SQL Compact 3.5 SP2开发的,并且支持Entity Framework 4。该过程支持SQL Compact的32位和64位安装。该过程是在Visual Studio 2010中开发的。

本文概述的流程源自Steve Lasker的博客文章MSDN故障排除文章。此流程在几个方面与Lasker的流程有所不同。

  • Lasker将SQL Compact支持DLL导入到项目中。本文中的流程改用生成后事件,以减少项目树的混乱。
  • Lasker的流程基于Windows ClickOnce技术。本文中的流程使用的是更传统的Windows Installer技术。

我们正处于从32位世界向64位世界的过渡时期。SQL Compact支持这两种类型的安装,并且它将选择适合安装它的机器类型的正确DLL。如果您在64位机器上开发,SQL Compact 3.5 SP2的全局安装应包含64位版本(在Program Files文件夹中)和32位版本(在Program Files (x86)文件夹中)。本文的流程会将SQL Compact支持DLL的两个版本安装在单独的文件夹中。如果您在32位机器上开发并且无法访问64位支持DLL,则可以省略单独的文件夹,只安装32位版本。但是,我不推荐这种方法,因为我们的应用程序的寿命往往比我们预期的要长。我们今天写的任何东西很可能都会在64位时代继续使用。

公共部署与私有部署

在过去一年左右的时间里,SQL Compact受到了越来越多的关注。微软最近将其指定为桌面应用程序的首选数据库技术,并且它与Entity Framework 4配合得很好。部署SQL Compact的官方方法是在用户机器上进行全局安装,就像SQL Express一样。但是,许多开发人员(包括我)认为这种方法存在几个缺点。

  • 首先,这是用户必须执行的另一个安装。根据我的经验,用户讨厌安装,而他们最讨厌的是基础结构安装。
  • 其次,我的应用程序在开发时所依赖的SQL Compact版本可能会从用户机器上删除。例如,用户将来可能会升级SQL Compact。升级存在破坏我的应用程序的风险。

出于这些原因,许多开发人员更喜欢使用SQL Compact的*私有安装*。私有安装可以由您的应用程序安装程序在您的应用程序文件夹中执行,用户甚至无需知道SQL Compact在那里。您的SQL Compact版本将与您的应用程序一起使用,并且仅与您的应用程序一起使用。该应用程序不会因SQL Compact上的另一个安装(即使是公共安装)而被破坏,您的安装也不会破坏任何其他应用程序。

私有安装流程

以下是创建SQL Compact SP2私有安装的流程。该流程假设您首先将所需的DLL从开发机器上的全局安装复制到解决方案文件夹根目录的*Libraries*文件夹中,而不是直接处理全局安装中的DLL。这种方法的优点是,您始终拥有应用程序开发所依据的DLL。例如,当SQL Compact 4.0发布时,我将我的开发机器升级到SQL Compact 4.0,我仍然会在应用程序的*Libraries*文件夹中拥有我在应用程序中使用的3.5 SP2版本DLL。

步骤1 – 创建项目库文件夹

首先,我们在项目*Libraries*文件夹中创建文件夹以容纳SQL Compact运行时。在解决方案的根目录下创建一个*Libraries*文件夹,并在其中创建一个*SqlCompact*文件夹。在*SqlCompact*文件夹中,创建两个子文件夹:*AMD64*和*X86*。

步骤2 – 复制主程序集

接下来,我们将两个主要的SQL Compact程序集复制到*Libraries*文件夹。这些文件是32/64位无关的,因此我们可以从*Program Files*文件夹或*Program Files (x86)*文件夹复制它们。由于我们可以使用任一版本,我们将任意选择*Program Files*文件夹并从那里复制它们。但是请注意,我们必须复制*Private*子文件夹中找到的版本。它们是为私有部署设计的特殊版本的程序集。

在开发机器上转到以下文件夹

C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Private

将以下文件从该文件夹复制到*SqlCompact*项目库文件夹的根目录

  • System.Data.SqlServerCe.dll
  • System.Data.SqlServerCe.Entity.dll

请注意,如果您不使用Entity Framework 4,则可以省略此处及下文对*System.Data.SqlServerCe.Entity.dll*的引用。现在*SqlCompact*文件夹应如下所示

步骤3 – 复制64位支持DLL

SQL Compact运行时需要七个支持DLL,它们是为32位和64位平台分别编译的。我们将首先复制64位版本。在开发机器上转到以下文件夹

C:\Program Files\Microsoft SQL Server Compact Edition\v3.5

将以下文件从该文件夹复制到*AMD64*项目库文件夹的根目录

  • sqlceca35.dll
  • sqlceca35.dll
  • sqlcecompact35.dll
  • sqlceer35EN.dll
  • sqlceme35.dll
  • sqlceoledb35.dll
  • sqlceqp35.dll
  • sqlcese35.dll

现在*AMD64*项目库文件夹应如下所示

步骤4 – 复制32位支持DLL

现在我们将复制运行时支持DLL的32位版本。在开发机器上转到以下文件夹

C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5

将同一七个文件从该文件夹复制到*X86*项目库文件夹的根目录

  • sqlceca35.dll
  • sqlceca35.dll
  • sqlcecompact35.dll
  • sqlceer35EN.dll
  • sqlceme35.dll
  • sqlceoledb35.dll
  • sqlceqp35.dll
  • sqlcese35.dll

现在*X86*项目库文件夹应如下所示

至此,我们已将部署所需的文件放在项目库文件夹中。现在我们转向部署。

步骤5 – 添加对主程序集的引用

我们需要手动将对主要SQL Compact程序集的引用添加到Visual Studio 2010解决方案资源管理器中的项目引用列表中。请注意,正如我们上面所看到的,这些程序集最初位于开发机器上的SQL Compact安装的*Private*文件夹中。

在解决方案资源管理器中右键单击*References*节点,然后从上下文菜单中选择“添加引用”。单击“浏览”选项卡,然后导航到项目库文件夹中的*SqlCompact*文件夹。选择以下文件,然后单击“确定”。

  • System.Data.SqlServerCe.dll
  • System.Data.SqlServerCe.Entity.dll

在*References*节点中,选择两个引用;然后选择属性网格。将*Copy Local*更改为*True*。这告诉VS将程序集复制到应用程序输出目录,即使SQL Compact已安装在您的开发计算机上。当Visual Studio生成您的项目时,它会将程序集复制到应用程序输出目录,并且还将它们添加到应用程序的安装项目中的“检测到的依赖项”列表中。

步骤6 – 添加生成后事件

有两种方法可以将SQL Compact运行时支持DLL添加到项目中。第一种是显式添加它们,方法是在项目中创建文件夹并在这些文件夹中创建指向库文件的链接。这是Steve Lasker在他的博客文章中使用的方法。第二种方法是使用生成后事件将文件复制到应用程序输出文件夹。我们将使用第二种方法,因为它减少了项目树的混乱。

要添加文件,我们需要在应用程序输出文件夹中创建*AMD64*和*X86*文件夹;然后我们将支持DLL复制到这些文件夹。以下是执行此操作的批处理命令:

mkdir "$(ProjectDir)$(OutDir)AMD64"
mkdir "$(ProjectDir)$(OutDir)X86"
copy "$(SolutionDir)Libraries\SqlCompact\AMD64\*.*" "$(ProjectDir)$(OutDir)AMD64"
copy "$(SolutionDir)Libraries\SqlCompact\X86\*.*" "$(ProjectDir)$(OutDir)X86"

应在主项目属性页的“生成后事件命令行”框中输入批处理命令。

步骤7 – 向App.config添加标记

我们需要向*App.config*文件添加一些变通标记,以使SQL Compact能够使用Entity Framework 4。首先,将以下标记添加到*App.config*文件的<configuration>部分的末尾。

<system.data>
    <DbProviderFactories>
        <remove
	invariant="System.Data.SqlServerCe.3.5"></remove>
        <add name="Microsoft
	SQL Server Compact Data Provider"
            invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data
	Provider for Microsoft SQL Server Compact"
                type="System.Data.SqlServerCe.SqlCeProviderFactory, 
			System.Data.SqlServerCe,
	Version=3.5.1.0, Culture=neutral,
                PublicKeyToken=89845dcd8080cc91"/>
    </DbProviderFactories>
</system.data>

Steve Lasker的博客文章解释了此标记的推理。

接下来,将以下标记添加到上一个片段的正下方。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Data.SqlServerCe"
	publicKeyToken="89845dcd8080cc91" culture="neutral"/><bindingRedirect
                oldVersion="3.5.1.0-3.5.1.50" newVersion="3.5.1.50"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

MSDN故障排除文章解释了此标记的推理。

步骤8 – 从安装先决条件中删除SQL Compact

在Visual Studio 2010中选择应用程序安装项目的根节点,然后从上下文菜单中选择“属性”。在项目属性页对话框中单击“先决条件”按钮。如果选中了SQL Server Compact 3.5 SP2的条目,则意味着要运行应用程序,必须在目标计算机上全局安装SQL Compact。我们将从私有安装运行SQL Compact,因此如果该项被选中,请取消选中它。

步骤9 – 在安装项目中创建支持文件的文件夹

在安装项目中,打开文件系统编辑器,然后在应用程序文件夹节点下创建两个文件夹。

  • AMD64
  • X86

文件系统编辑器应如下所示

步骤10 – 添加64位支持DLL

在文件系统编辑器中,右键单击您创建的*AMD64*文件夹,然后从上下文菜单中选择*添加* > *文件*。导航到程序库文件夹中的*AMD64*子文件夹,选择该文件夹中的所有七个支持DLL,然后单击“打开”。

步骤11 – 添加32位支持DLL

对32位DLL重复步骤10,将它们从程序库文件夹中的*X86*文件夹复制到您在安装项目中创建的*X86*文件夹。

步骤12 – 编译

在Visual Studio中编译解决方案。假设一切正常,您的应用程序应没有任何错误地编译。但是,您将看到七个警告,关于与您定位的应用程序平台(32位或64位)不对应的支持DLL版本。警告将如下所示:

您可以忽略这些警告,因为SQL Compact运行时足够智能,可以为安装它的系统选择正确的支持DLL集。

结论

希望本文能阐明SQL Compact私有安装的一些混乱之处。请记住,本文介绍的流程适用于SQL Compact 3.5 SP2;它可能不适用于SQL Compact 4.0发布时。

一如既往,我正在寻求读者的反馈。阅读这些文章的人提供的同行评审非常有帮助,始终受到赞赏。如果您有任何问题,请在下方发布,我将尽力回答。

© . All rights reserved.