以数据库为先决条件的ClickOnce部署

时间:2011-01-21 21:17:56

标签: winforms deployment clickonce manifest bootstrapper

我想要使用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

谢谢, 大卫

3 个答案:

答案 0 :(得分: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

第二个先决条件是“所有用户=真”安装项目,其中有一个位于默认位置的自定义文件夹:     “[COMMONAPPDATAFOLDER] [生产] [产品名称]”。 在这个文件夹中我放了sdf文件。

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

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

我仍在寻找不那么复杂的解决方案,它将安装到Windows 7和Windows XP。

答案 1 :(得分:0)

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

干杯!

答案 2 :(得分:0)

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