我想杀死一些ClickOnce应用程序 - 我可以从代码中访问ClickOnce“安装文件夹URL”吗?

时间:2010-08-05 14:59:46

标签: c# clickonce

我想要一个离线的ClickOnce应用程序(他们可以从“开始”菜单运行它),但我希望我的应用程序的功能类似于在线应用程序(确保网页/服务器在那里运行)。通过这种方式,我可以取消(卸载)ClickOnce应用程序,它将停止为最终用户工作,而无需转到1000的桌面。这适用于内部企业环境,因此我们可以完全控制服务器,最终客户等。

全世界有很多客户。基本上,我想给他们一个消息,如“此应用程序功能已移至XXX应用程序,请改为使用它”。或者“此应用程序已退役。”如果我可以从代码中获取安装文件夹URL,我可以在该目录中放置一个message.xml文件,其中包含一些逻辑标记以实现此目的。如果该消息不存在(服务器脱机),我可能会使应用程序正常失败并指示用户联系其本地IT部门寻求帮助。

或者可以用不同的方式完成同样的事情吗?

4 个答案:

答案 0 :(得分:1)

我使用以下代码来解决部分问题:

            try
            {
                // The next four lines probe for the update server.
                // If the update server cannot be reached, an exception will be thrown by the GetResponse method.
                string testURL = ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
                HttpWebRequest webRequest = WebRequest.Create(testURL) as HttpWebRequest;
                webRequest.Proxy.Credentials = CredentialCache.DefaultCredentials;
                HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;

                // I discard the webResponse and go on to do a programmatic update here - YMMV
            }
            catch (WebException ex)
            {
                // handle the exception
            }

可能还有一些其他有用的例外 - 我在我使用的代码中有更多的例外,但我认为其余的都与ClickOnce更新可以抛出的异常有关。

处理丢失的服务器案例 - 虽然它确实要求您在服务器退役之前主动将其放置到位。

答案 1 :(得分:1)

如果应用程序仅在线,则只能获取部署提供程序URL。否则它不可用。

除了移动部署之外,您还可以以编程方式卸载并重新安装该应用程序。

您将新版本(或您要安装的任何内容)部署到另一个URL。然后,将卸载/重新安装代码添加到旧版本并进行部署。当用户运行它时,他将获得更新,然后它将自行卸载并调用要安装的新部署。

有关卸载和重新安装ClickOnce应用程序的代码,请参阅MSDN上有关证书过期的文章 Certificate Expiration in ClickOnce Deployment

答案 2 :(得分:0)

您可以创建一个新版本的应用程序,其中只包含一个消息框,说明“此应用程序已停用”并进行部署。

下次用户启动应用程序时,将下载新版本,显示您的消息框。

答案 3 :(得分:0)

我所做的是将这个问题的评论结合起来,并将我自己的一些评论与下面的答案结合起来。

XML文档保存为HTML(我们的Web服务器不允许XML传输):

<?xml version="1.0" encoding="utf-8"?>
<appstatus>
    <online status="true" message="online"/>
</appstatus>

然后我从上面读取了以下代码,并使用它来查看应用程序是否应该关闭:

            string testURL = "";
            try
            {
                // Probe for the update server. 
                // If the update server cannot be reached, an exception will be thrown by the GetResponse method. 
#if !DEBUG
                testURL = ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString() + "online.html"; 
#else
                testURL = "http://testserver/appname/online.html";
#endif
                HttpWebRequest webRequest = WebRequest.Create(testURL) as HttpWebRequest;
                webRequest.Credentials = CredentialCache.DefaultCredentials;
                HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
                StreamReader reader = new StreamReader(webResponse.GetResponseStream());
                XmlDocument xmlDom = new XmlDocument();
                xmlDom.Load(reader);
                if (xmlDom["usdwatcherstatus"]["online"].Attributes["status"].Value.ToString() != "true")
                {
                    MessageBox.Show(xmlDom["usdwatcherstatus"]["online"].Attributes["message"].Value.ToString());
                    this.Close();
                    return;
                }
            }
            catch (WebException ex)
            {
                // handle the exception 
                MessageBox.Show("I either count not get to the website " + testURL + ", or this application has been taken offline.  Please try again later, or contact the help desk."); 
            }