通过C#代码从Lotus Notes(.nsf)文件提取附件时发生异常

通过C#代码从Lotus Notes(.nsf)文件提取附件时发生异常,c#,lotus-domino,C#,Lotus Domino,当我在foreach循环中将itemA对象强制转换为Notesitem时,下面出现异常,请有人帮助我 无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Domino.NotesItem”。此操作失败,因为对具有IID“{2913158A-2EED-1069-BF5D-00DD011186B7}”的接口的COM组件的QueryInterface调用失败,原因是以下错误:不支持此类接口(HRESULT中的异常:0x80004002(E_NOINTERFACE))。在

当我在foreach循环中将itemA对象强制转换为Notesitem时,下面出现异常,请有人帮助我

无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Domino.NotesItem”。此操作失败,因为对具有IID“{2913158A-2EED-1069-BF5D-00DD011186B7}”的接口的COM组件的QueryInterface调用失败,原因是以下错误:不支持此类接口(HRESULT中的异常:0x80004002(E_NOINTERFACE))。在WindowsApplication2.Form1.btn搜索\u单击C:\WindowsApplication2\WindowsApplication2\Form1.cs中的(对象发送者,事件参数e):第319行}

我正在使用Interop.Domino.dll和代码:

        NotesSession session = new NotesSession();
        session.Initialize("XXXXXX");
        try
        {
            NotesDatabase NotesDb = session.GetDatabase("", "C:\LotusFiles\\XYZ.nsf", false);

            if (NotesDb == null)
            {
                //System.Console.WriteLine("Can not connect to server.");
            }
            else
            {
                //System.Console.WriteLine("Connected");
            }

            Domino.NotesDocumentCollection col = NotesDb.AllDocuments;
            for (int i = 0; i < col.Count; ++i)
            {
                Domino.NotesDocument doc = col.GetNthDocument(i);

                if (doc.HasEmbedded)
                {
                    object[] itemsA = (object[])doc.Items;
                    foreach (NotesItem item in itemsA)
                    {
                        if (item.Name.Equals("$FILE"))
                        {
                            object[] values = (object[])item.Values;
                            //doc.GetAttachment(values[0].ToString()).ExtractFile(fileSavePath + values[0].ToString());
                        }
                    }
                }



            }
NotesSession session=newnotessession();
会话初始化(“XXXXXX”);
尝试
{
NotesDatabase NotesDb=session.GetDatabase(“,”C:\LotusFiles\\XYZ.nsf),false);
if(NotesDb==null)
{
//System.Console.WriteLine(“无法连接到服务器”);
}
其他的
{
//系统控制台写入线(“已连接”);
}
Domino.NotesDocumentCollection col=NotesDb.AllDocuments;
对于(int i=0;i
问题解决了……Interop.Domino.dll在我的案例中已损坏,所有面临此问题的人请不要从internet下载Interop.Domino.dll,而是转到reference-->Add reference-->COM-->查找Lotus Domino对象和宾果!!!

这相当简单,不是吗?看起来像
doc.Items
is没有返回
NoteItem
s。这是预期的吗?您能找到
NotesDocument.Item
的文档吗?如果不是,您截断的错误的其余部分是什么:“由于以下原因失败…”?20多年前,我曾做过Notes API编程。我不熟悉当前的C#API,但你之所以会收到这条消息,是因为
itemsA
数组中的对象没有实现
NotesItem
接口。坦白说,我不知道它们是什么类型。在
foreach
行上放置一个断点,然后检查返回数组中的项。实际上Interop.Domino.dll是com组件,我已经尝试了regasm.exe之类的方法来确保它正常工作。我不认为这是com注册的问题。发生的情况是,
itemsA
是com
IOObject
指针的集合(或者,
IDispatch
,我不确定)但要用C语言将其转换为
NotesItem
,它需要从实现NotesItem方法的COM对象中获得一个不同的接口。它通过调用对象上的
QueryInterface
来实现这一点,由于某种原因,这是失败的。也许答案是您截断的错误消息中的一位:您能给我们错误消息的其余部分,请?“由于fo而失败…”后的位。
E_NOINTERFACE
:对,所以这不是随机失败,是因为您要返回的对象不认为它是
NotesItem
(或者更确切地说,它没有实现与GUID的接口,这意味着它是指IOTESITY或类似的,您可以在注册表中检查)。不幸的是,由于它实际上是隐藏在COM代理后面的(而且不容易从C++代码中挖掘出,而不需要调试符号)。