2011-01-21 311 views
0

我有一个Winforms应用程序,我想使用ClickOnce进行发布。此应用程序附带一个初始数据库,该数据库必须在每台计算机上安装一次。经过不少的努力,我已经着手使用自定义先决条件来安装.sdf文件。我使用了Bootstrapper Manifest Generator(BMG)为我想运行的.cmd文件创建一个包,并且将.sdf文件作为“附加文件”。以数据库为前提的ClickOnce部署

我的期望是这两个文件最终会在同一个目录下,我将能够将.sdf文件复制到我想要的地方(它们最终会在同一个目录中).pre在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 

谢谢, 大卫

回答

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。

0

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

干杯!

+0

它似乎没有问题 – 2011-01-22 00:07:06

0

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

+0

喜罗宾。我在研究过程中碰到了你的文章,这对定义问题很有帮助。但是,我的情况不同的是,我需要一台每台机器(又名“CommonAppDataFolder”)数据库而不是每个用户数据库。 (可以考虑使用电脑控制的实验室设备或类似的安排,任何用户都可以登录,登录到计算机,并且需要访问通用的每台计算机数据库。) – 2011-01-27 18:13:21