You can run your add-in via HKLM for all users WITHOUT ClickOnce with this hard-to-find trick:
Put a pipe and a "vstolocal" flag after your VSTO manifest path value thus:
at 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 like so:
at 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)
Also, if you are installing to a 64-bit version of Windows, you will have to enable local machine installation with two values in another location:
at HKLM64\SOFTWARE\Microsoft\VSTO Runtime Setup\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 10/03/2013...
It also turns out that Outlook 2010 in Win64 has further difficulty trusting VSTO add-ins unless you sign them with a real Code Signing PFX and put the certificate in the Trusted Publishers store of the user's machine. I wrote this command line utility with the PFX embedded in the executable to make the certificate part of the installation process. To gain access to the local machine Trusted Publishers store, this must be run as 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);
}
}
}