diff --git a/src/OutlookAddin.UI/ViewModels/SettingsViewModel.cs b/src/OutlookAddin.UI/ViewModels/SettingsViewModel.cs index 504b5b4..a0b8258 100644 --- a/src/OutlookAddin.UI/ViewModels/SettingsViewModel.cs +++ b/src/OutlookAddin.UI/ViewModels/SettingsViewModel.cs @@ -214,42 +214,25 @@ namespace MarcusLaw.OutlookAddin.UI.ViewModels return; } - // VSTO add-ins cannot be updated programmatically from inside - // a running Outlook — ApplicationDeployment.Update() throws. - // Don't shell-launch the .vsto URL either: Chrome / Edge will - // download it to disk, and the resulting file has a different - // security zone than the deployment manifest, which fails with - // InvalidDeploymentException ("no matching security zones"). - // Call VSTOInstaller.exe directly so the URL is processed in - // the Internet zone, matching the manifest. - var installerPath = FindVstoInstaller(); - if (installerPath != null) - { - try - { - System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo( - installerPath, "/I \"" + manifestUri + "\"") - { - UseShellExecute = false - }); - UpdateStatusBrush = SuccessBrush; - UpdateStatus = $"זמינה גרסה {availableVersion} — אשר את ההתקנה בחלון שנפתח, ואז סגור ופתח את Outlook."; - } - catch (Exception launchEx) - { - _logger.Warning(launchEx, "CheckForUpdate: VSTOInstaller launch failed"); - UpdateStatusBrush = ErrorBrush; - UpdateStatus = $"זמינה גרסה {availableVersion} — סגור ופתח את Outlook כדי להתקין אוטומטית."; - } - } - else - { - // VSTOInstaller not at the canonical path — VSTO runtime - // still picks up new manifests on Outlook startup, so - // ask the user to restart instead of attempting a hack. - UpdateStatusBrush = SuccessBrush; - UpdateStatus = $"זמינה גרסה {availableVersion} — סגור ופתח את Outlook כדי להתקין אוטומטית."; - } + // A running Outlook holds file locks on the loaded add-in + // DLLs. Neither ApplicationDeployment.Update (TrustNotGranted) + // nor a direct VSTOInstaller.exe /I call (0x8007007E + // ERROR_MOD_NOT_FOUND) nor Process.Start(.vsto URL) (Chrome + // downloads to local-machine zone — InvalidDeploymentException) + // can install over those locks. The only path that actually + // works is the one VSTO runtime takes automatically on Outlook + // startup: it checks the manifest URL before loading the + // add-in, downloads + installs if there's a newer version, + // then loads it. + // + // So the button's job is just to tell the user: "close and + // reopen Outlook." That's the same flow the user has been + // doing manually all along; we're just confirming the new + // version is there waiting. + UpdateStatusBrush = SuccessBrush; + UpdateStatus = + $"זמינה גרסה {availableVersion}. סגור ופתח את Outlook — " + + "הגרסה החדשה תותקן אוטומטית בעלייה."; return; } catch (System.Deployment.Application.DeploymentDownloadException ex) @@ -303,50 +286,6 @@ namespace MarcusLaw.OutlookAddin.UI.ViewModels } } - /// - /// Locates VSTOInstaller.exe on the machine. The path is stable - /// for VSTO 4.0 (Office 2010+) — falls back to a registry lookup - /// if the default install location was customised. - /// - private static string? FindVstoInstaller() - { - string[] candidates = - { - @"C:\Program Files (x86)\Common Files\Microsoft Shared\VSTO\10.0\VSTOInstaller.exe", - @"C:\Program Files\Common Files\Microsoft Shared\VSTO\10.0\VSTOInstaller.exe" - }; - foreach (var p in candidates) - { - if (System.IO.File.Exists(p)) return p; - } - - // Registry fallback: HKCR\VstoFile\shell\Open\command stores - // the verb VSTOInstaller registers for the .vsto extension. - try - { - using (var key = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(@"VstoFile\shell\Open\command")) - { - var cmd = key?.GetValue(null) as string; - if (!string.IsNullOrEmpty(cmd)) - { - // Value looks like: "C:\...\VSTOInstaller.exe" "%1" - var firstQuote = cmd!.IndexOf('"'); - if (firstQuote == 0) - { - var endQuote = cmd.IndexOf('"', 1); - if (endQuote > 1) - { - var exe = cmd.Substring(1, endQuote - 1); - if (System.IO.File.Exists(exe)) return exe; - } - } - } - } - } - catch { /* registry access denied or schema differs — fall through */ } - return null; - } - private bool CanCheckForUpdate() => !IsCheckingForUpdate; partial void OnIsCheckingForUpdateChanged(bool value) diff --git a/src/OutlookAddin/OutlookAddin.csproj b/src/OutlookAddin/OutlookAddin.csproj index 1c379fa..215b58c 100644 --- a/src/OutlookAddin/OutlookAddin.csproj +++ b/src/OutlookAddin/OutlookAddin.csproj @@ -36,7 +36,7 @@ C:\Users\Chaim\source\repos\OutlookAddin\Publish\ https://gitea.dev.marcus-law.co.il/espocrm-extensions/OutlookAddin/raw/branch/main/Publish/ en - 1.2.6.0 + 1.2.7.0 false true 7 diff --git a/src/OutlookAddin/Properties/AssemblyInfo.cs b/src/OutlookAddin/Properties/AssemblyInfo.cs index 106a786..23625a2 100644 --- a/src/OutlookAddin/Properties/AssemblyInfo.cs +++ b/src/OutlookAddin/Properties/AssemblyInfo.cs @@ -33,6 +33,6 @@ using System.Security; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.6.0")] -[assembly: AssemblyFileVersion("1.2.6.0")] +[assembly: AssemblyVersion("1.2.7.0")] +[assembly: AssemblyFileVersion("1.2.7.0")]