Outlook VSTO加载项80005查找任务时出现异常

Outlook VSTO加载项80005查找任务时出现异常,outlook,vsto,outlook-addin,office-addins,Outlook,Vsto,Outlook Addin,Office Addins,我有一个VSTO插件,它通过EntryID或主题查找Outlook任务,并对其执行一些操作 其中一个用户从中记录了以下错误消息: 由于以下错误,检索CLSID为{0006F03A-0000-0000-C000-0000000000 46}的组件的COM类工厂失败:80080005服务器执行失败(来自HRESULT的异常:0x80080005(CO_E_服务器执行失败)) 下面是查找任务项的函数 public Outlook.TaskItem FindTask(String EntryID, St

我有一个VSTO插件,它通过EntryID或主题查找Outlook任务,并对其执行一些操作

其中一个用户从中记录了以下错误消息:

由于以下错误,检索CLSID为{0006F03A-0000-0000-C000-0000000000 46}的组件的COM类工厂失败:80080005服务器执行失败(来自HRESULT的异常:0x80080005(CO_E_服务器执行失败))

下面是查找任务项的函数

public Outlook.TaskItem FindTask(String EntryID, String Subject)
{
    try
    {
        Outlook.Application OutlookApp = new Outlook.Application();
        Outlook.NameSpace ns = null;
        Outlook.MAPIFolder tasksFolder = null;
        Outlook.Items taskFolderItems = null;
        Outlook.Items filteredtaskFolderItems = null;
        Outlook.TaskItem task = null;


        ns = OutlookApp.Session;
        ns.SendAndReceive(false);
        tasksFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks);
        taskFolderItems = tasksFolder.Items;

        //Try to find the task by entryID
        dynamic OutlookItem = null;
        OutlookItem = ns.GetItemFromID(EntryID);
        if (OutlookItem != null)
        {
            if (OutlookItem is Outlook.TaskItem)
            {
                Outlook.TaskItem foundItem = (Outlook.TaskItem)OutlookItem;
                return foundItem;
            }
        }

        //If not found by EntryID, find it by a Subject
        string subjectmatch = "[Subject] ='" + Subject + "'";
        filteredtaskFolderItems = taskFolderItems.Restrict(subjectmatch);

        for (int i = 1; i <= filteredtaskFolderItems.Count; i++)
        {
            task = (Microsoft.Office.Interop.Outlook.TaskItem)filteredtaskFolderItems[i];
            return task;
        }
    }
    catch(Exception ex)
    {
        //log exception
    }
    return null;
}
public Outlook.TaskItem FindTask(字符串EntryID,字符串主题)
{
尝试
{
Outlook.Application OutlookApp=新建Outlook.Application();
Outlook.ns=null;
Outlook.MAPIFolder tasksFolder=null;
Outlook.Items taskFolderItems=null;
Outlook.Items filteredtaskforderitems=null;
Outlook.TaskItem任务=null;
ns=OutlookApp.Session;
ns.发送和接收(假);
tasksFolder=ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks);
taskFolderItems=tasksFolder.Items;
//尝试通过entryID查找任务
动态OutlookItem=null;
OutlookItem=ns.GetItemFromID(EntryID);
if(OutlookItem!=null)
{
if(OutlookItem为Outlook.TaskItem)
{
Outlook.TaskItem foundItem=(Outlook.TaskItem)OutlookItem;
退货项目;
}
}
//如果EntryID未找到,请通过主题找到它
字符串subjectmatch=“[Subject]=”+Subject+”;
filteredtaskFolderItems=taskFolderItems.Restrict(subjectmatch);

对于(int i=1;i这很可能意味着您的应用程序运行在与Outlook不同的安全上下文中。
应用程序是否以提升的权限运行(以管理员身份运行)


另外,如果此代码位于外接程序中,为什么要创建Outlook.Application的新实例而不是使用传递给外接程序的实例?

您好,Dmitry!感谢您的回复,并积极处理这些Outlook问题!我上面提到的代码在Excel外接程序中运行,我在其中创建了Outlook实例,然后从中开始工作e、 外接程序在Excel和Outlook之间创建连接,这就是我实例化新Outlook对象的原因。关于安全上下文,我不知道有关它的任何信息,我按照MSDN教程和文章以及SDK创建了此连接。我无法重现此问题,但我的一些客户端可以。当他从不想要,并导致了一个例外..还有什么想法吗?另外,如果你也能检查一下这个问题,我将非常高兴:这是另一个Outlook的迷雾,我无法解决。那么运行是否以“以管理员身份运行”的身份启动?如果Outlook在您的代码实例化Outklook.ApplicationOn对象的实例之前未运行,该方法是否有效?我不知道有一项要求,即外接程序必须在管理员权限下运行。通常,我会按原样启动office应用程序,而无需右键单击并以管理员身份运行。它可以如果Outlook没有运行,它将停止运行,即使它正在运行,它也会工作。我知道这里有改进的余地,所以如果它已经运行,我应该只获取正在运行的实例,而不是创建一个新实例,但为了简化代码示例,我忽略了它。它似乎对报告的问题没有影响。最糟糕的是,我不能但是如果安全上下文不匹配,您将遇到问题。