4

我已经使用 Visual Studio 2010 创建了一个 Outlook 插件,它可以正常安装并在程序文件 (x86) 中创建适当的注册表项和文件夹,正如我指定的那样,它显示在添加和删除程序中。

但是,当我启动 Outlook 2010 时 - 它没有出现,当我检查 COM 插件时,它在列表中不可用。我在 VS 中创建了安装程序,并像往常一样在文件系统中添加了主项目的输出,并且还包含了该.vsto文件。

任何人请指点?

4

2 回答 2

4

由于您正在运行x64 OSx64 Office,因此您不使用Wow6432Node- 它仅用于x64 OS 上的 32 位应用程序的注册表反射。供您使用的正确注册表配置单元如下......

所有用户 Hive(x64 操作系统上的 x64 Office)

HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook\Addins\[add-in ID]

请参阅有关正确 VSTO 注册表路径的相关 SO 帖子

于 2012-10-24T13:37:15.667 回答
3

您可以通过 HKLM 为所有用户运行您的加载项,而无需 ClickOnce 使用这个难以找到的技巧:

在您的 VSTO 清单路径值之后放置一个管道和一个“vstolocal”标志,因此:

HKLM\Software\Microsoft\Office\Outlook\Addins\MyVSTOAddIn
manifest="C:\Program Files\Publisher\MyVSTOAddIn\MyVSTOAddIn.vsto|vstolocal"

(参见:http: //blogs.msdn.com/b/vsto/archive/2010/03/08/deploying-your-vsto-add-ins-to-all-users-saurabh-bhatia.aspx

并像这样设置 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);
        }
    }
}
于 2013-09-16T21:16:48.287 回答