最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - ClickOnce Application on Bluehost: .application File Downloads Instead of Running, Requires Manual Relaunch After Update -

programmeradmin0浏览0评论

I am working on a ClickOnce-deployed WPF application hosted on Bluehost. The application successfully checks for updates and downloads the latest version. However, there’s a critical issue:

When trying to update, the .application file downloads instead of running.

The browser treats the .application file as a regular download, rather than recognizing it as a ClickOnce deployment file. This prevents the application from seamlessly updating as intended.

I’d like the update process to run the .application file directly and automatically restart the application after the update is applied, without requiring the user to relaunch it manually.

Here is my current deployment structure on Bluehost:

/solutions/
  internaltesting.application
  mysolutions.version.txt
  publish.htm
  setup.exe
  Application Files/....

This is the code I use to check for and apply updates:

public static Version? CheckForUpdates()
{
    try
    {
        Version currentVersion = GetCurrentAssemblyVersion();

        using (WebClient client = new WebClient())
        {
            client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);

            // Fetch the latest version from the server
            string versionString = client.DownloadString(serverUpdateUrl + "mysolutions.version.txt").Trim();
            Version latestVersion = Version.Parse(versionString);

            Debug.WriteLine($"Current Version: {currentVersion}, Latest Version: {latestVersion}");

            // Return the latest version if it's newer than the current version
            return latestVersion > currentVersion ? latestVersion : null;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Error checking for updates: {ex.Message}", "Update Error", MessageBoxButton.OK, MessageBoxImage.Error);
        return null;
    }
}

public static Version GetCurrentAssemblyVersion()
{
    if (ApplicationDeployment.IsNetworkDeployed)
    {
        return ApplicationDeployment.CurrentDeployment.CurrentVersion;
    }

    Assembly assembly = Assembly.GetExecutingAssembly();
    FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
    Debug.WriteLine($"Running Assembly Version: {versionInfo.ProductVersion}");
    return new Version(versionInfo.ProductVersion);
}

public static void PerformUpdate()
{
    try
    {
        if (ApplicationDeployment.IsNetworkDeployed)
        {
            ApplicationDeployment deployment = ApplicationDeployment.CurrentDeployment;

            if (deployment.CheckForUpdate())
            {
                deployment.Update();

                MessageBox.Show("The application has been updated successfully! Restarting...",
                                "Update Successful",
                                MessageBoxButton.OK,
                                MessageBoxImage.Information);

                RestartApplicationInClickOnceContext();
                Application.Current.Shutdown();
            }
            else
            {
                MessageBox.Show("No updates are available.", "No Updates Available", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }
        else
        {
            MessageBox.Show("This application is not network-deployed. Updates are not available.",
                            "Update Error",
                            MessageBoxButton.OK,
                            MessageBoxImage.Warning);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Update failed: {ex.Message}", "Update Error", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

private static void RestartApplicationInClickOnceContext()
{
    try
    {
        // Restart the application using the ClickOnce deployment URL
        string activationUrl = ApplicationDeployment.CurrentDeployment.UpdateLocation.AbsoluteUri;

        Process.Start(new ProcessStartInfo
        {
            FileName = activationUrl,
            UseShellExecute = true
        });
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Failed to restart the application: {ex.Message}", "Restart Error", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

what I expect is:

When the user triggers the update, the .application file should run/install automatically, not download.

After applying the update, the application should restart automatically, without requiring the user to manually relaunch it.

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论