ClickOnce 部署问题
-
06-07-2019 - |
题
我正在开发一个使用 ClickOnce 部署的项目,并且遇到了几个问题。
我的软件解决方案中有两个组件:一个桌面客户端需要 。网 运行框架 3.5,以及一个服务器(网络平台 应用程序),其中列出了可用文档并提供了使用 ClickOnce 安装桌面客户端的方法。
我的第一个问题是先决条件问题:我需要一种在客户端安装之前安装 3.5 框架的方法。视觉工作室创建了一个 setup.exe
它负责这一点,但为了使其工作,它必须直接运行(而不是链接到 .application
文件)和部署 网址 创建 ClickOnce 清单时必须知道。
所以我还有两个问题:安装客户端应用程序后,显然无法使用查询字符串参数运行客户端应用程序 setup.exe
, ,因此,我只能有一个链接,而不是让服务器显示链接到“.../client.application?document=doc1”之类的 URL 的文档列表 setup.exe
.
另一个问题是最糟糕的:该服务器旨在用于相对较小的专用网络,而不是在单个 Web 服务器上。问题是:我不知道构建时 ClickOnce 客户端的部署 URL,因此 setup.exe
当选中“从网站安装”选项时,无法正常运行。目前,解决方法是使用离线安装程序,其中包含 setup.exe
, 、先决条件和 ClickOnce 部署文件位于一个大 ZIP 文件中。
具有适当框架版本的用户仍然可以使用 .application
使用查询字符串链接到文档以安装/更新客户端并打开文档。没有框架的用户会收到错误消息(“系统更新需要 blablabla 3.5.0.0 blabla GAC”),并且必须下载 ZIP 文件,将其解压到本地计算机并运行 setup.exe
文件来安装框架,然后是客户端。之后,他必须返回到文档列表并使用该链接以正确的参数启动客户端。
不用说,我对这种策略并不感到非常自豪,它破坏了所有 ClickOnce 部署优势。
是否有可能以更优雅的方式摆脱先决条件问题?在网络中部署服务器时,是否有一种简单的方法可以修改 ClickOnce 应用程序的安装 URL(例如将 URL 写入配置文件或其他内容)?
解决方案
我也一直在尝试解决“我不知道构建时 clickonce 客户端的部署 URL”问题。
我能想到的最好办法(我刚刚开始编写它,所以这仍然是猜测)是编写一个最终用户将运行的实用程序来设置部署URL。这在 .NET 中似乎是可能的,但您需要:
- 使用 ManifestReader.ReadManifest 读取清单
- 设置 DeploymentUrl
- ManifestWriter.WriteManifest
然后您必须使用 SecurityUtilities.SignFile 再次签署清单
签名过程让我很困扰。要么我必须使用一次性证书(这使得签名毫无意义),要么我需要使用来自 CA 的证书,然后我必须分发我的密码才能重新签署清单(这很愚蠢,因为它使我的证书不安全) 。所以我似乎让用户看到“未知发布者”和黄色感叹号......
其他提示
为了在我们的连续构建系统中构建ClickOnce应用程序并部署到多个测试服务器,我花了一些时间与 Mage 和文章 演练:手动部署ClickOnce应用程序 。
我不确定这是否会解决您的第二个问题,但如果您部署到多个服务器,它至少可能会从构建过程中消除一些痛苦。如果您可以分发 mage.exe
(不确定Microsoft是否允许),您可以在安装期间在现场修改清单。
也许解决方案是:
使用 PublishUrl=http://点击一次/is/kinka/cool,在客户端计算机上更改了位于上的Windows主机文件
%windir%\system32\drivers\etc\hosts并将主机单击一次 服务器的固定IP地址.
也许 ClickOnce 应该有一个选项来检测下载应用程序的服务器;如果有人知道请在这里发帖;
如果用户在域上,那么我将使用组策略将sysadmin推送到.NET 3.5 / Windows Update 或用于管理桌面的其他策略。
听起来像环境问题。如果组织足够大,可以拥有系统管理员,则该人员有责任为应用程序提供运行环境。
如果该组织没有这个角色的人,那么我相信你会回到你的手动解决方案。此外,手动执行并不一定会破坏“ClickOnce的所有优点”...... ClickOnce的优势在于您可以修改客户端,重新发布并且客户端计算机将自动升级...
我想另一种选择是编写一个获取并安装.NET 3.5然后安装应用程序的脚本,我之前没有这样做过......我有理由相信它会起作用......实际上,你可以通过获得.NET 3.5的组策略部署启动脚本,这非常简单。
也许可以利用 NAnt 来自动更改部署网址。我用它来自动化我的ClickOnce构建并更改清单的构建版本。 ClickOnce with NAnt 描述了我做到了。
第二个问题:
您可以在项目,解决方案或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中发布到的位置。如果既未指定 InstallUrl
也未指定 UpdateUrl
属性,则将其插入ClickOnce应用程序清单中。
InstallUrl
(未显示)是用户从中安装应用程序的位置。如果指定,如果启用了IsWebBootstrapper属性,则此值将刻录到 setup.exe
引导程序中。如果未指定 UpdateUrl
,它也会插入到应用程序清单中。
第一个问题:
如果上述答案不能满足您的需求,那么在我看来您面临着一个典型的问题;如何在多个桌面上安装Windows可执行文件(在您的情况下为.NET Framework 3.5)。 组策略(GP)脚本或 WMI 。