【发布时间】:2018-04-18 08:59:04
【问题描述】:
我正在尝试在 C# .NET 4.6.1 WPF 项目中添加对“Microsoft Outlook 16.0 对象库”的引用,因为我安装了 Office 2016。以前版本的对象库与 2016 版的 office 不兼容。
如果我使用 Excel 的 VBA 编辑器,则会列出“Microsoft Outlook 16.0 对象库”,并且存在于 C:\Program Files\WindowsApps\Microsoft.Office.Desktop_16010.9126.2116.0_x86_8wekyb3d8bbwe\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\MSOUTL.OLB 中,如下所示:
但是,当我使用 Visual Studio 时,COM 选项卡没有列出“Microsoft Office 16.0 对象库”,当我尝试浏览到 C:\Program Files\WindowsApps 时,我得到“您当前无权访问此文件夹”,并单击“继续”(获取访问权限)会导致“您已被拒绝访问此文件夹的权限”。
所以基本上,Office 2016 dll 似乎被隐藏在一个人、狗和本地管理员都无法访问的文件夹中。
我要做的就是连接到打开的 Outlook 应用程序,然后发送一封带有附件的电子邮件,所以也许另一个问题是,是否有一些新奇的方式与 Outlook 2016 进行通信出现在我的 Googleathon 中?
另外值得注意的是,我的 Office 版本是作为“Windows 应用商店应用程序”安装的,因此不会出现在通常的“添加/删除程序”列表中,因此我找不到任何“修复”选项进行安装。
谢谢。
进一步的调查表明我在做正确的事 - 尝试添加对“Microsoft Outlook 16.0 对象库”的 COM 引用现在是针对 Outlook 的正确方法...https://stackoverflow.com/a/21018418/5040941。
我检查了 GAC,但程序集未注册。我已经通过“应用程序和功能”右键单击开始菜单选项进行了修复,但它们仍然没有出现 - 就好像 Windows 应用商店应用程序只是将它们的 dll 推到 Program Files\WindowsApps\* 文件夹中,而不是麻烦在 GAC 中注册它们。
回答备受赞赏的 cmets!
使用以下代码
Outlook.Application application = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
如果我使用 nuget Microsoft.Office.Interop.Outlook 包,我会得到 System.Runtime.InteropServices.COMException: 'Invalid class string (Exception from HRESULT: 0x800401F3 (CO_E_CLASSSTRING))' 异常。
如果我尝试通过 Add Reference 的 Assemblies/Extensions 选项卡使用 Microsoft Outlook 15.0 Object Library 或 Microsoft Outlook 14.0 Object Library 引用,则会收到 System.Runtime.InteropServices.COMException: 'Invalid class string (Exception from HRESULT: 0x800401F3 (CO_E_CLASSSTRING))' 异常。
我不认为访问 WindowsApps 文件夹是可行的方法。 首先,由于某种原因它被锁定,这通常表明如果我开始挖掘和更改安全权限可能会出现麻烦,更不用说在我的解决方案中维护最新 dll 的副本无疑会给我的项目增加不必要的复杂性。
其次,但更重要的是,如果我安装了 office,并且可以从 Excel Vba 访问“Microsoft Outlook 16.0 Object Library”,那么为什么我不能从 Visual Studio 访问它?
安装程序没有正确注册 dll 显然存在一些问题,只有 Excel 有一些技巧可以用来提供参考。
阅读此文的人是否成功安装了 Office 365/2016 Windows 应用商店并在 Visual Studio 中找到了对“Microsoft Outlook 16.0 对象库”的引用?
只有我有这个问题吗?!因为它会影响我办公室中运行 Windows 10 和 Office 365 的多台计算机...
回答 RogerN(谢谢),请看下图 - 我没有列出 Microsoft.Office.Interop.Outlook 版本 16,也没有列出 Microsoft.Office.Core。
如果我尝试使用 v15 库,则会收到以下错误:
System.Runtime.InteropServices.COMException
HResult=0x80040154
Message=Retrieving the COM class factory for component with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Source=mscorlib
*答案是 *
我从戴尔购买的两台电脑都是 64 位的,但它们预装了 32 位的 Windows 商店版本的 MS Office 2016/365。
为了解决这个问题,我不得不:
- 从
Settings > Apps > Apps&Features > Microsoft Office Desktop Apps > Uninstall卸载商店应用程序 - 登录portal.office.com
- 选择安装办公应用,高级,选择 64 位版本
为什么戴尔认为我们希望在 64 位机器上安装 32 位版本,或者为什么微软的人没有发布解决此问题的方法,我无法理解,但无论如何,RogerN 是正确的。感谢大家抽出时间来帮助我。
【问题讨论】:
-
你试过使用
Nuget包Microsoft.Office.Interop.Outlook -
谢谢 - 我刚刚尝试添加它,但描述说“这是执行 Office 2013 Outlook 互操作所必需的程序集”。我正在使用 Office 2016。使用此软件包时仍然遇到相同的错误。版本是 15.x,但我正在寻找 16.x。
-
您可以在 Office 2016 中使用较旧的互操作...不能另辟蹊径
-
正如@Ctznkane525 所说,旧版本没有帮助吗?另外,如果没有,您可以从 Windows 命令/终端复制此文件,甚至无法访问?
-
您是否可以在 64 位计算机上安装 32 位版本的 Office?这将导致仅注册 32 位 COM 对象,而 64 位 .NET 应用程序将无法找到它们。
标签: c# excel visual-studio outlook office-interop