admin管理员组

文章数量:1335840

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.

本文标签: