如果我有最低要求版本,如何回滚clickOnce?

时间:2008-10-27 22:06:23

标签: .net clickonce

我们决定在clickOnce应用程序清单中使用minimumRequiredVersion,现在当我们尝试在用户启动应用程序时回滚到以前的版本时,它无法启动。它表示应用程序清单的版本早于所需版本,用户无法使用该应用程序。我们没有使用minimumRequiredVersion这个问题,但我们想使用它。

4 个答案:

答案 0 :(得分:8)

您必须部署具有更高版本号的新版本。没有内置的回滚功能。

答案 1 :(得分:2)

您可以使用Mage.exe将部署清单(.application文件扩展名)更新为更高版本,并选择以前版本的应用程序清单。就像chilltemp所说,你仍然需要更高版本,但你不必重新部署你的代码。

答案 2 :(得分:0)

如果要在客户端最低要求版本之前将版本回滚到上一版本,则需要重新安装clickonce应用程序。

请查看此链接,了解如何在代码中完成此操作:ClickOnce and Expiring Code Signing Certificates

答案 3 :(得分:0)

如果您知道发布者uri以及部署和应用程序的名称,版本语言公钥令牌和处理器体系结构,则可以通过反射来完成。

以下代码将尝试回滚“coolapp.app”点击一次应用。如果它无法回滚,它将尝试卸载它。


using System;
using System.Deployment.Application;
using System.Reflection;

namespace ClickOnceAppRollback
{
    static class Program
    {
        /// 
        /// The main entry point for the application.
        /// 
        static void Main()
        {
            string appId = string.Format("{0}#{1}, Version={2}, Culture={3}, PublicKeyToken={4}, processorArchitecture={5}/{6}, Version={7}, Culture={8}, PublicKeyToken={9}, processorArchitecture={10}, type={11}",
                /*The URI location of the app*/@"http://www.microsoft.com/coolapp.exe.application",
                /*The application's assemblyIdentity name*/"coolapp.app",
                /*The application's assemblyIdentity version*/"10.8.62.17109",
                /*The application's assemblyIdentity language*/"neutral",
                /*The application's assemblyIdentity public Key Token*/"0000000000000000",
                /*The application's assemblyIdentity processor architecture*/"msil",
                /*The deployment's dependentAssembly name*/"coolapp.exe",
                /*The deployment's dependentAssembly version*/"10.8.62.17109",
                /*The deployment's dependentAssembly language*/"neutral",
                /*The deployment's dependentAssembly public Key Token*/"0000000000000000",
                /*The deployment's dependentAssembly processor architecture*/"msil",
                /*The deployment's dependentAssembly type*/"win32");

            var ctor = typeof(ApplicationDeployment).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(string) }, null);
            var appDeployment = ctor.Invoke(new object[] { appId });

            var subState = appDeployment.GetType().GetField("_subState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(appDeployment);
            var subStore = appDeployment.GetType().GetField("_subStore", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(appDeployment);
            try
            {
                subStore.GetType().GetMethod("RollbackSubscription").Invoke(subStore, new object[] { subState });
            }
            catch
            {
                subStore.GetType().GetMethod("UninstallSubscription").Invoke(subStore, new object[] { subState });
            }
        }
    }
}