自定义ClickOnce安装程序

时间:2011-06-09 21:25:46

标签: clickonce

我需要对ClickOnce安装程序进行后期操作,应在应用程序文件存储在客户端但应用程序首次运行之前执行。具体来说,我想加密配置文件的各个部分。

根据我的发现,可以添加一个包含InPlaceHostingManager方法的类,并在以后将其用于显式安装/更新,但是如何覆盖默认的ClickOnce安装程序以便调用自定义代码?

我想模仿古老的Setup Project的行为,它调用你插入项目的System.Configuration.Install.Installer的继承者的Install方法。

感谢。

3 个答案:

答案 0 :(得分:1)

我不相信ClickOnce可以实现这一点。

我认为你的一些选择包括:

  1. 返回MSI安装程序
  2. 将配置文件编码为开发/发布计算机上的前/后编译步骤,然后部署完全编码的版本
  3. 在应用的first run上编码配置文件(如果您找到了确保它们未被锁定的方法)
  4. 另外,您提到了InPlaceHostingManager。在我看来,这是托管ClickOnce安装框架的一种方式(而不是通过IE进行)。因此,这可能允许您创建自定义安装应用程序来承载安装并运行安装后步骤,但问题是您仍需要以某种方式安装自定义安装应用程序(并以具有安装权限的用户身份运行) ...

答案 1 :(得分:1)

为什么不能在应用程序运行之前首先对文件进行编码呢?真的太晚了吗?

您可以使用InPlace托管管理器更新clickonce应用程序。您可以使用它来安装一个,唯一的问题是您必须提前安装.NET Framework,或者在C中编写一些小的exe来检查它(不能是托管代码)。

看看这是否有助于您: http://msdn.microsoft.com/en-us/library/dd997001(v=VS.100).aspx

答案 2 :(得分:0)

您可以使用 FirstRun

命名空间:System.Deployment.Application

程序集:System.Deployment(在System.Deployment.dll中)

方法将调用First Window。

private void DownloadFileGroupSync(string fileGroup)
        {
            if (ApplicationDeployment.IsNetworkDeployed)
            {
                ApplicationDeployment deployment = ApplicationDeployment.CurrentDeployment;

                if (deployment.IsFirstRun)
                {
                    try
                    {
                        if (deployment.IsFileGroupDownloaded(fileGroup))
                        {
                            deployment.DownloadFileGroup(fileGroup);
                        } 
                    }
                    catch (InvalidOperationException ioe)
                    {
                        MessageBox.Show("This application is not a ClickOnce application. Error: " + ioe.Message);
                        return;
                    }

                    downloadStatus.Text = String.Format("Download of file group {0} complete.", fileGroup);
                }
            }            
        }