我在一家开发CRM工具的公司工作,并提供从Windows XP到7的MS Office(2003& 2007)的集成。(我正在使用Win7工作)
我的任务是当用户想要发送电子邮件并预填充CRM工具的数据(电子邮件,收件人等等)时,从此CRM工具调用Outlook实例(使用C#)。
所有这些都已经很好了。
我遇到的问题是Outlook的“对象模型防范”正在抛出com异常
(操作中止(HRESULT异常:0x80004004(E_ABORT)))
我尝试从mailItem读取受保护的值(例如mail.bodyHTML)。
示例代码段:
using MSOutlook = Microsoft.Office.Interop.Outlook;
//untrusted Instance
_outlook = new MSOutlook.Application();
MSOutlook.MailItem mail = (MSOutlook.MailItem)_outlook.CreateItem(MSOutlook.OlItemType.olMailItem);
//this where the Exception occurs
string outlookStdHTMLBody = mail.HTMLBody;
我已经做了很多阅读,并且知道我的Outlook实例(使用新的应用程序派生)被认为是不可信的,因此“omg”开始了。
我确实有一个开发方法:
我以管理员身份运行VS2010,如果我以管理员身份运行 Outlook - 一切都很好。我想这是因为他们具有相同的完整性级别(高)并且UAC(?)没有抱怨。但这不是部署的方式。
现在的问题是:
有没有办法获取Outlook的可信实例,以便我可以避免此异常?
我已经读过,使用VSTO开发Office加载项时,可以从OnComplete事件和/或使用“ThisAddin”获取受信任的实例
但我“只是”想要启动一个outlook实例并预先填充它,并且不想开发一个Add-In,因为这不是必需的。
为了说清楚 - 我没有问题弹出窗口通知用户正在访问Outlook - 我只是想摆脱异常!
那么如何使用代码解决这个问题?
非常感谢任何帮助!
托马斯
答案 0 :(得分:2)
看看德米特里的Redemption Lib,它的目的就是为了做到这一点。
答案 1 :(得分:0)
那么,
我已经在这个问题上花费了太多的时间和精力,所以我想我为我的具体案例提出了一个实用的解决方法 - 但没有真正的解决方案!
问题显然是由于程序运行在不同的完整性级别(Outlook = medium,VS2010 = admin或high)。默认情况下,Office在中等级别运行,因此我的未来应用程序一旦部署就会运行。所以不应该有任何麻烦,因为如果CRM和Outlook运行在同一水平,那就没问题了。
对于开发,我只是让它们都运行在高或中(从调试文件夹启动我编译的文件)。
在任何其他情况下,都会显示一个消息框警告,通知用户导致异常并阻止访问的不同完整性级别。
在代码级别,当我尝试读取任何(通过Outlook)预先解压缩,受保护的属性和对象模型保护引发异常时,我只是捕获它并使用默认值。
为什么我必须首先阅读它们目前已超出我的范围 - 但是交给我的规格也是如此。
无论如何,感谢阅读,如果我想出一个解决方案,我一定会用它来解决它 - 直到那时记住一个实用的解决方案比没有好!
大家父亲节快乐!