diff --git a/src/OutlookAddin.UI/ViewModels/SettingsViewModel.cs b/src/OutlookAddin.UI/ViewModels/SettingsViewModel.cs index 7ac8530..504b5b4 100644 --- a/src/OutlookAddin.UI/ViewModels/SettingsViewModel.cs +++ b/src/OutlookAddin.UI/ViewModels/SettingsViewModel.cs @@ -216,22 +216,39 @@ namespace MarcusLaw.OutlookAddin.UI.ViewModels // VSTO add-ins cannot be updated programmatically from inside // a running Outlook — ApplicationDeployment.Update() throws. - // Open the .vsto URL via the shell; Windows hands it to - // VSTOInstaller.exe which installs the update correctly. - try + // 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) { - System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(manifestUri.ToString()) + try { - UseShellExecute = true - }); - UpdateStatusBrush = SuccessBrush; - UpdateStatus = $"זמינה גרסה {availableVersion} — אשר את ההתקנה בחלון שנפתח, ואז סגור ופתח את Outlook."; + 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 כדי להתקין אוטומטית."; + } } - catch (Exception launchEx) + else { - _logger.Warning(launchEx, "CheckForUpdate: shell launch of installer URL failed"); - UpdateStatusBrush = ErrorBrush; - UpdateStatus = $"זמינה גרסה {availableVersion} אבל לא הצלחנו לפתוח את חלון ההתקנה. גש ידנית ל-{manifestUri}"; + // 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 כדי להתקין אוטומטית."; } return; } @@ -286,6 +303,50 @@ 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 a2d8e1d..2273dcf 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.4.0 + 1.2.5.0 false true 7 diff --git a/src/OutlookAddin/Properties/AssemblyInfo.cs b/src/OutlookAddin/Properties/AssemblyInfo.cs index ab2636a..d3f7075 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.4.0")] -[assembly: AssemblyFileVersion("1.2.4.0")] +[assembly: AssemblyVersion("1.2.5.0")] +[assembly: AssemblyFileVersion("1.2.5.0")]