我已经使用 Visual Studio 2010 创建了一个 Outlook 插件,它可以正常安装并在程序文件 (x86) 中创建适当的注册表项和文件夹,正如我指定的那样,它显示在添加和删除程序中。
但是,当我启动 Outlook 2010 时 - 它没有出现,当我检查 COM 插件时,它在列表中不可用。我在 VS 中创建了安装程序,并像往常一样在文件系统中添加了主项目的输出,并且还包含了该.vsto
文件。
任何人请指点?
我已经使用 Visual Studio 2010 创建了一个 Outlook 插件,它可以正常安装并在程序文件 (x86) 中创建适当的注册表项和文件夹,正如我指定的那样,它显示在添加和删除程序中。
但是,当我启动 Outlook 2010 时 - 它没有出现,当我检查 COM 插件时,它在列表中不可用。我在 VS 中创建了安装程序,并像往常一样在文件系统中添加了主项目的输出,并且还包含了该.vsto
文件。
任何人请指点?
由于您正在运行x64 OS和x64 Office,因此您不使用Wow6432Node
- 它仅用于x64 OS 上的 32 位应用程序的注册表反射。供您使用的正确注册表配置单元如下......
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook\Addins\[add-in ID]
您可以通过 HKLM 为所有用户运行您的加载项,而无需 ClickOnce 使用这个难以找到的技巧:
在您的 VSTO 清单路径值之后放置一个管道和一个“vstolocal”标志,因此:
在HKLM\Software\Microsoft\Office\Outlook\Addins\MyVSTOAddIn
manifest="C:\Program Files\Publisher\MyVSTOAddIn\MyVSTOAddIn.vsto|vstolocal"
并像这样设置 EnableLocalMachineVSTO 标志:
在HKLM\Software\Microsoft\Office\14.0\Common\General
(DWORD) EnableLocalMachineVSTO=1
(参见:http ://social.msdn.microsoft.com/Forums/vstudio/en-US/e724cdcb-ccad-4d9f-826a-65a6816409f9/vsto-alluser-addin-fails-to-load-on-several-clients )
此外,如果要安装到 64 位版本的 Windows,则必须在另一个位置使用两个值启用本地计算机安装:
在HKLM64\SOFTWARE\Microsoft\VSTO Runtime Setup\v4
(DWORD) EnableVSTOLocalUNC=1
(DWORD) EnableLocalMachineVSTO=1
(见: http: //support.microsoft.com/kb/2022442)
无需 SideBySide、PromptingLevel、VSTO\Security\Inclusion 和 Active Setup\Installed Components “StubPath”!只需安装并运行。
添加于 2013 年 10 月 3 日...
事实证明,Win64 中的 Outlook 2010 在信任 VSTO 加载项方面存在进一步的困难,除非您使用真正的代码签名 PFX 对它们进行签名并将证书放在用户计算机的受信任的发布者存储中。我编写了这个命令行实用程序,其中嵌入了可执行文件中的 PFX,以使证书成为安装过程的一部分。要访问本地计算机 Trusted Publishers 存储,必须以管理员身份运行:
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);
}
}
}