我正在开发一个使用 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top