ClickOnce部署问题

时间:2009-06-22 09:42:46

标签: .net clickonce prerequisites

我正在开发一个使用ClickOnce部署的项目,我正在处理几个问题。

我的软件解决方案中有两个组件:需要.NET框架3.5才能运行的桌面客户端,以及列出可用文档并提供安装桌面的方法的服务器(ASP.NET应用程序)客户使用ClickOnce。

我的第一个问题是前提条件:我需要一种在客户端安装之前安装3.5框架的方法。 Visual Studio创建了一个setup.exe来处理它,但为了使它工作,它必须直接运行(而不是链接到.application文件),部署{{3}创建ClickOnce清单时必须知道。

所以我还有两个问题:在用setup.exe安装后,显然没有办法用查询字符串参数运行客户端应用程序,所以不要让服务器显示链接到URL的文档列表“ ... / client.application?document = doc1“我只能链接到setup.exe

另一个问题是最糟糕的:服务器旨在用于相对较小的专用网络,而不是用于单个Web服务器。问题是:我在构建时不知道ClickOnce客户端的部署URL,因此当选中“从网站安装”选项时,setup.exe无法正常运行。目前,解决方法是在大型ZIP文件中安装一个包含setup.exe,先决条件和ClickOnce部署文件的脱机安装程序。

具有适当框架版本的用户仍然可以使用带有查询字符串的.application链接来安装/更新客户端并打开文档。没有框架的用户会收到错误消息(“系统更新需要blablabla 3.5.0.0 blabla GAC”),并且必须下载ZIP文件,将其解压缩到本地计算机并运行setup.exe文件以安装框架,然后是客户。之后,他必须返回文档列表并使用该链接以适当的参数启动客户端。

毋庸置疑,我对此策略并不感到自豪,这种策略破坏了ClickOnce的所有部署优势。

是否有可能以更优雅的方式摆脱先决条件问题?在网络中部署服务器时是否有一种简单的方法来修改ClickOnce应用程序的安装URL(比如在配置文件中写入URL)?

6 个答案:

答案 0 :(得分:6)

我也一直试图解决“我不知道clickonce客户端在构建时的部署URL”问题。

我能做到的最好(我刚刚开始编写它,所以这仍然是猜测)是编写一个最终用户将运行的实用程序,它将设置deploymentURL。这在.NET中似乎是可能的,但您需要:

  • 使用ManifestReader.ReadManifest
  • 读入清单
  • 设置DeploymentUrl
  • ManifestWriter.WriteManifest

然后,您必须使用SecurityUtilities.SignFile再次签署清单

签约过程困扰着我。要么我必须使用一次性证书(这使得签名毫无意义)或者我需要使用来自CA的证书然后我必须分发我的密码以便重新签署清单(这是愚蠢的,因为它使我的证书不安全) 。所以我似乎留下了用户看到“Unknown Publisher”和黄色感叹号......

答案 1 :(得分:5)

为了在我们的持续构建系统中构建ClickOnce应用程序并部署到多个测试服务器,我花了一些时间在Mage和文章 Walkthrough: Manually Deploying a ClickOnce Application

我不确定这是否会解决您的第二个问题,但如果您部署到多个服务器,它至少可能会从构建过程中消除一些痛苦。如果您可以分发mage.exe(不确定Microsoft是否允许),您可以在安装期间在现场修改清单。

答案 2 :(得分:1)

也许解决方案是:

使用PublishUrl = http:// clickonce / is / kinda / cool 并在客户端计算机上更改位于
的Windows主机文件 %WINDIR%\ System32 \ drivers下\等\主机的 并将主机clickonce指向服务器的固定IP地址

也许ClickOnce应该有一个选项来检测从中下载应用程序的服务器;如果有人知道请在这里发帖;

答案 3 :(得分:0)

可能会利用NAnt来自动更改部署URL。我用它来自动化我的ClickOnce构建并更改清单的构建版本。 ClickOnce with NAnt 描述了我是如何做到的。

答案 4 :(得分:0)

如果用户在某个域上,那么我将使用Group Policies / Windows Update或者使用其他任何策略来管理桌面的sysadmin推送.NET 3.5。

听起来像环境问题。如果组织足够大,可以拥有系统管理员,则该人员有责任为应用程序提供运行环境。

如果该组织没有这个角色的人,那么我相信你会回到你的手动解决方案。此外,手动执行并不一定会破坏“ClickOnce的所有优点”...... ClickOnce的优势在于您可以修改客户端,重新发布并且客户端计算机将自动升级...

我想另一种选择是编写一个获取并安装.NET 3.5然后安装应用程序的脚本,我之前没有这样做过......我有理由相信它会起作用......实际上,你可以通过获得.NET 3.5的组策略部署启动脚本,这非常简单。

答案 5 :(得分:0)

第二个问题:

您可以在项目,解决方案或MSBuild文件上使用MSBuild发布目标,如下所示:

C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe "C:\path\foo.vbproj" /target:Publish /property:"PublishUrl=http://clickonce/is/kinda/cool/" /property:"PublishUrl=http://clickonce/is/kinda/cool/" 

PublishUrl是应用程序将在IDE中发布到的位置。如果未指定InstallUrlUpdateUrl属性,则将其插入ClickOnce应用程序清单。

InstallUrl(未显示)是用户从中安装应用程序的位置。如果指定,则在启用IsWebBootstrapper属性时,此值将刻录到setup.exe引导程序中。如果未指定UpdateUrl,它也会插入到应用程序清单中。

第一个问题:

如果上述答案不能满足您的需求,那么在我看来您面临着一个典型的问题;如何在多个桌面上安装Windows可执行文件(在您的情况下为.NET Framework 3.5)。有多种解决方案,例如Group Policy(GP)脚本或WMI