You can run your add-in via HKLM for all users WITHOUT ClickOnce with this hard-to-reach trick:
Hang up and the "vstolocal" flag after the VSTO path path value like this:
in HKLM \ Software \ Microsoft \ Office \ Outlook \ Addins \ MyVSTOAddIn
manifest = "C: \ Program Files \ Publisher \ MyVSTOAddIn \ MyVSTOAddIn.vsto | vstolocal"
(See: http://blogs.msdn.com/b/vsto/archive/2010/03/08/deploying-your-vsto-add-ins-to-all-users-saurabh-bhatia.aspx )
and set the EnableLocalMachineVSTO flag as follows:
in HKLM \ Software \ Microsoft \ Office \ 14.0 \ Common \ General
(DWORD) EnableLocalMachineVSTO = 1
(see http://social.msdn.microsoft.com/Forums/vstudio/en-US/e724cdcb-ccad-4d9f-826a-65a6816409f9/vsto-alluser-addin-fails-to-load-on-several-clients )
In addition, if you are installing on a 64-bit version of Windows, you need to enable the installation of the local computer with two values ββin another location:
in HKLM64 \ SOFTWARE \ Microsoft \ VSTO Runtime Settings \ v4
(DWORD) EnableVSTOLocalUNC = 1
(DWORD) EnableLocalMachineVSTO = 1
(See: http://support.microsoft.com/kb/2022442 )
No SideBySide, no PromptingLevel, no VSTO \ Security \ Inclusion and no Active Setup \ Installed Components "StubPath" necessary! Just install and run.
Added 03/10/2013 ...
It also turns out that Outlook 2010 on Win64 makes it even more difficult to trust VSTO add-ins if you do not sign them with genuine PFX Code Signing PFX and put the certificate in the repository. Trusted publishers of the user machine. I wrote this command-line utility with the PFX executable built in to make the certificate part of the installation process. To access the repository of trusted publishers on the local computer, this must be run as an administrator:
using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; using System.IO; namespace TrustCert { class Program { static void Main(string[] args) { string msg = ""; try { byte[] pfx; var assembly = typeof(Program).Assembly; string pfxName = ""; foreach (string mr in assembly.GetManifestResourceNames()) { if (mr.Contains("MyPfxName")) { pfxName = mr; break; } } using (var stream = assembly.GetManifestResourceStream(pfxName)) { pfx = new byte[stream.Length]; stream.Read(pfx, 0, pfx.Length); } X509Certificate2 cert = new X509Certificate2(pfx, "pfxPassword"); X509Store store = new X509Store(StoreName.TrustedPublisher , StoreLocation.LocalMachine); store.Open(OpenFlags.ReadWrite); store.Add(cert); store.Close(); msg = "Certificate installed"; } catch (Exception e) { msg = e.ToString(); } Console.WriteLine(msg); } } }