使用Microsoft.办公室Interop.Outlook获取Outlook应用程序和获取MAPI命名空间失败



我正试图将一个从旧电脑(64位Windows 7 Ultimate,零售Office x86(上运行的Outlook.exe读取MailItems的x86应用程序迁移到新电脑(64位Windows 10 Pro,Office 365 x86(。我在两台电脑上都使用VS2010;嵌入互操作类型"=符合事实的

从Outlook获取应用程序和命名空间时,应用程序失败(请参阅下面的代码和异常(。我有理由相信我没有引用正确的Outlook.dll或PIA。我已经在网上搜索了可能适用于我的配置的当前信息。我发现最好的是无法添加对Outlook 2016(Office 365(Interop(16.0.0.0(的引用这个问题的解决方案提出了两个解决方案"强制应用程序为x86或将Office 365安装为64位"x86">
原因是Visual Studio只会在64位Windows上向GAC注册64位版本的.dll
在我的情况下,应用程序一直是x86,Office 365是而且必须是x86。我使用MS Access和Excel VBA模块,两者都按预期工作,引用的.dll没有问题。
我的问题:我应该引用哪个.dll,在哪里可以找到它们,或者我需要DirectCast吗
详细信息:

下面的代码是问题代码的摘录。只有在";尝试"实际问题。

导入Microsoft。办公室Interop。见解'处理GUI和数据结构设置的代码和声明。。。'从窗体调用。显示的处理程序私有子获取消息((Dim应用程序为Microsoft。办公室Interop。见解应用程序=无Dim ns As Microsoft。办公室Interop。见解NameSpace=无尝试app=New Application(('执行。。。但是ns=应用程序。GetNamespace("MAPI"('引发异常ns。登录(无、无、错误、错误(’。。。。读取MailItems的代码。。。。Catch ex As系统。运行时。InteropServices。COMException调试。WriteLine(例如ToString(((最后ns=无subFolder=无内容inboxFolder=无内容'应用程序。可能不需要Quit((app=什么都没有结束尝试End Sub

运行时,上面的代码在GetNamespace调用处引发下面的异常
无法强制转换"Microsoft"类型的COM对象。办公室Interop。见解ApplicationClass"到接口类型"Microsoft。办公室Interop。Outlook_应用程序"。此操作失败,因为对IID为"{00063001-0000-0000-C000-000000000046}"的接口的COM组件的QueryInterface调用由于以下错误而失败:找不到元素。(HRESULT出现异常:0x8002802B(TYPE_E_ELEMENTNOTFOUND((。

当然,我的代码取决于是否有正确的引用。我通过将解决方案从旧电脑复制到新电脑来达到这一点。然后我将其加载到VS2010中并重新生成。此重新生成将引用更改为:
Microsoft。办公室核心--C:\WINDOWS\assembly\GAC_MSIL\Office\15.0.0.0__71e9cce111e9429c\Office.dll
Microsoft。办公室InterOp。Outlook--C:\WINDOWS\assembly\GAC_MSIL\Microsoft。办公室Interop。Outlook\15.0.0.0__71e9cce111e9429c\Microsoft.Office.Interop.Outlook.dll

尝试"修理";您的Microsoft Office安装。转到"程序和功能",选择"修改",然后选择"联机修复"。看来你的windows注册表项搞砸了。阅读有关此类问题的更多信息:

  • 无法强制转换Microsoft类型的COM对象。办公室Interop。Outlook
  • Outlook问题-无法强制转换"Microsoft"类型的COM对象。办公室Interop。见解ApplicationClass'

我在使用我在桌面上构建的代码时遇到了类似的问题,但由于这个问题,代码无法运行。我使用这种方法来获取一个属性,该属性是主类中的应用程序。它似乎起作用:首先,我使用别名使内容更易于阅读,所以XL是用using语句设置的:

using XL=Microsoft.Office.Interop.Excel;

然后我使用应用程序的显式强制转换,而不是仅使用";应用程序";我用过(XL.应用

public XL.Application XlApp
{
get
{
if (xlApp == null)
{
xlApp = new XL.Application();
}
xlApp.DisplayAlerts = false;
return xlApp;
}
set => xlApp = (XL.Application)value;
}  

我希望这能带来一些好处,即使它不能完全解决问题。

Joey

最新更新