17

我正在开发一个使用 ClickOnce 部署的项目,并且遇到了几个问题。

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

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

所以我还有两个问题:显然没有办法在使用setup.exe. document=doc1" 我只能有一个指向setup.exe.

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

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

不用说,我对这种破坏所有 ClickOnce 部署优势的策略并不感到自豪。

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

4

6 回答 6

7

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

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

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

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

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

于 2009-06-24T22:15:45.250 回答
5

In order to build ClickOnce applications in our continuous build system and deploy to several test servers, I spent some time with Mage and the article Walkthrough: Manually Deploying a ClickOnce Application.

I am not sure if this will solve your second problem, but it might at least take some pain out of the build process if you deploy to multiple servers. If you can distribute mage.exe (not sure if Microsoft allows it), you can modify your manifests on-site during installation.

于 2009-06-22T22:10:51.140 回答
1

也许解决方案是:

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

也许 ClickOnce 应该有一个选项来检测下载应用程序的服务器;如果有人知道,请在此处发布;

于 2010-08-04T22:48:24.830 回答
0

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

于 2009-06-24T03:09:21.320 回答
0

如果用户在域中,那么我会让系统管理员使用组策略/ Windows 更新或任何其他用于管理桌面的策略推出 .NET 3.5。

听起来确实是环境问题。如果组织足够大,可以拥有一名系统管理员,那么为应用程序运行提供环境应该是该人的责任。

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

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

于 2009-06-24T14:54:59.747 回答
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 中发布到的位置。InstallUrl如果未指定norUpdateUrl属性,则将其插入 ClickOnce 应用程序清单。

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

第一个问题:

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

于 2009-06-25T02:10:21.893 回答