【问题标题】:ClickOnce Deployment with a Database as a Prerequisite以数据库为先决条件的 ClickOnce 部署
【发布时间】:2011-01-21 21:17:55
【问题描述】:

我有一个想要使用 ClickOnce 发布的 Winforms 应用程序。此应用程序带有一个初始数据库,必须在每台机器上安装一次。经过一番折腾,我想到了使用自定义先决条件来安装 .sdf 文件。我使用 Bootstrapper Manifest Generator (BMG) 为要运行的 .cmd 文件创建了一个包,并将 .sdf 文件作为“附加文件”包含在内。

我的期望是这两个文件最终会在同一个目录中,并且我可以将 .sdf 文件复制到我想要的位置(它们最终会在同一个目录中。)必要条件在 Visual Studio 中显示得很好。它可以很好地部署到客户端系统,并且安装程序很好地启动了先决条件。

唯一的问题是.cmd文件正在执行的当前工作目录是C:\Documents and Settings\\Desktop!

这两个文件(.cmd 或 .sdf)都不在那里 - 它们是在其他地方下载的,例如“C:\Documents and Settings\drogers\Local Settings\Temp\VSD5A.tmp”。所以,虽然我知道 xcopy 到哪里,但我不知道从哪里 xcopy。

我该如何解决这个问题?

这里是 .cmd 文件:

REM Modify this file to reflect your manufacturer name [FHCRC] and product name [ClickOnceSharedDataDemo].
SET TargetBase=%ALLUSERSPROFILE%
IF NOT "%TargetBase%"=="C:\ProgramData" SET TargetBase=%ALLUSERSPROFILE%\Application Data
REM We only want to do this copy for the first user!
if exist "%TargetBase%\FHCRC\ClickOnceSharedDataDemo\shareddata.sdf" GOTO EXIT
if not exist "%TargetBase%\FHCRC" mkdir "%TargetBase%\FHCRC"
if not exist "%TargetBase%\FHCRC\ClickOnceSharedDataDemo" mkdir "%TargetBase%\FHCRC\ClickOnceSharedDataDemo"
CACLS "%TargetBase%\FHCRC\ClickOnceSharedDataDemo" /E /T /C /G "Users":C
xcopy shareddata.sdf "%TargetBase%\FHCRC\ClickOnceSharedDataDemo\"
if not exist "%TargetBase%\FHCRC\ClickOnceSharedDataDemo\shareddata.sdf" PAUSE
if not exist "%TargetBase%\FHCRC\ClickOnceSharedDataDemo\shareddata.sdf" exit /B -1
:EXIT
PAUSE
exit /B 0

谢谢, 大卫

【问题讨论】:

    标签: winforms deployment clickonce manifest bootstrapper


    【解决方案1】:

    好吧,我对这个解决方案并不完全满意,但它确实有效。我现在有两个先决条件。第一个只是运行 CACLS 命令来设置权限的命令文件。它基本上是上述的缩短版本:

    REM Modify this file to reflect your manufacturer name [Manufacturer] and product name [ProductName].
    SET TargetBase=%ALLUSERSPROFILE%
    IF NOT "%TargetBase%"=="C:\ProgramData" SET TargetBase=%ALLUSERSPROFILE%\Application Data
    REM We only want to do this copy for the first user!
    if exist "%TargetBase%\Manufacturer\ProductName\shareddata.sdf" GOTO EXIT
    if not exist "%TargetBase%\Manufacturer" mkdir "%TargetBase%\Manufacturer"
    if not exist "%TargetBase%\Manufacturer\ProductName" mkdir "%TargetBase%\Manufacturer\ProductName"
    CACLS "%TargetBase%\Manufacturer\ProductName" /E /T /C /G "Users":C
    :EXIT
    ECHO exit /B 0
    

    第二个先决条件是“所有用户 = true”安装项目,该项目在默认位置有一个自定义文件夹: “[CommonAppDataFolder][制造商][产品名称]”。 我将 sdf 文件放入此文件夹中。

    最后,我使用 Bootstrapper Manifest Generator 为两者制作包,使第二个依赖于第一个。我将包复制到相应的 VS2010 目录,将它们作为先决条件包含在内,然后发布。

    我现在将每台机器的 .sdf 文件发布到 WinXP 和 Win7。为什么要这么难!?!?

    我仍在寻找不太复杂的解决方案,可以同时安装到 Windows 7 和 Windows XP。

    【讨论】:

      【解决方案2】:

      您尝试过 MSDeploy 吗?它能够满足您的所有需求。

      干杯!

      【讨论】:

      • 似乎与问题无关
      【解决方案3】:

      您可以在 ClickOnce 应用程序中包含 .sdf 文件,然后让您的程序在第一次运行时将其复制到其他地方。无论如何,我从不建议将数据保存在 CLickOnce 缓存中,自己处理会更安全。看看这篇文章是否有帮助: http://robindotnet.wordpress.com/2009/08/19/where-do-i-put-my-data-to-keep-it-safe-from-clickonce-updates/

      【讨论】:

      • 嗨罗宾。我在做研究时遇到了你的文章,它有助于定义问题。但是,我的情况的不同之处在于我需要一个每台机器(又名“CommonAppDataFolder”)数据库而不是每用户数据库。 (想想一台电脑控制的实验室设备或类似的安排,任何用户都可以上来登录机器,并且需要访问一个通用的、每台机器的数据库。)
      • 没有内置的方法来处理带有 ClickOnce 部署的情况。它基于每个用户安装,并且无法访问用于所有用户的 CommonApplicationData 文件夹。您可以尝试在 ClickOnce 应用程序启动时以编程方式在 C 盘上创建一个文件夹,例如 C:\MyAppData\。我不知道 W7 是否会阻止你这样做。如果没有,那么您可以在第一个人运行应用程序时将其复制到那里。人们在他们的配置文件上安装并在此之后运行将使用已经存在的数据库。
      • 确实 ClickOnce 应用程序是按用户安装的,但它们确实可以访问特殊文件夹“CommonApplicationData”(以及子文件夹),如果已应用适当的权限。 “仅限每个用户”限制根本不适用于 ClickOnce 先决条件。我们使用先决条件来创建适当的子文件夹,例如“.\Publisher\Application”,以更改文件夹的权限,并将数据文件复制到那里。 (请注意,特殊文件夹会根据操作系统版本解析为不同的物理路径。)它可以工作 - 我们在生产中使用它。
      猜你喜欢
      • 2016-04-21
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      相关资源
      最近更新 更多