从C#与Lotus Notes交互的最佳方法和推荐做法是什么?

时间:2008-09-05 02:21:53

标签: c# interop lotus-notes

特别是,我必须以最快,最可靠的方式从Lotus Notes文件中提取所有消息和附件。可能相关的另一点是我需要从辅助线程执行此操作。

修改

感谢您的回答 - 两者都很好。我应该提供更多背景资料。

我们目前有一个使用Notes COM API的后台线程的WinForms应用程序。

然而它似乎不稳定。 (当然可能是我们做错了。)例如,我们发现我们必须在主线程上预先初始化Notes会话,否则在后台线程上调用session.CreateDXLExporter()会抛出异常。

10 个答案:

答案 0 :(得分:6)

我真的很讨厌NotesSession COM对象。

您不能在其初始化的线程之外的其他线程中使用它。 .NET中的线程是光纤,真正的底层线程可能随时改变。

所以我建议在使用块中以这种方式使用它:

Imports Domino
Imports System.Threading

Public Class AffinitedSession
    Implements IDisposable

    Private _session As NotesSession
    Public Sub New(ByVal pass As String)
        Thread.BeginThreadAffinity()
        _session = New NotesSession()
        _session.Initialize(pass)
    End Sub

    Public ReadOnly Property NotesSession() As NotesSession
        Get
            Return _session
        End Get
    End Property

    Private disposedValue As Boolean = False        ' To detect redundant calls

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: free other state (managed objects).
            End If

            ' TODO: free your own state (unmanaged objects).
            ' TODO: set large fields to null.
            _session = Nothing
            Thread.EndThreadAffinity()
        End If
        Me.disposedValue = True
    End Sub

#Region " IDisposable Support "
    ' This code added by Visual Basic to correctly implement the disposable pattern.
    Public Sub Dispose() Implements IDisposable.Dispose
        ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

End Class

注意Thread.BeginThreadAffinity()和Thread.EndThreadAffinity()

那些是你的朋友。

干杯!

答案 1 :(得分:3)

可以找到Lotus Notes COM Api参考here

要在VB.Net中获取Notes会话(起点),您可以使用:

Dim oSess As Object = Nothing
oSess = CreateObject("Notes.NotesSession")

我通常用C#编程,用COM操作我更喜欢VB.Net

最好从同一个线程访问所有COM服务器,除非您确定不会造成任何麻烦。

答案 2 :(得分:2)

答案 3 :(得分:2)

如果在同一台计算机上安装了Domino / Lotus Notes客户端,则可以使用COM。只需在“通过COM访问Domino对象”上进行Google搜索,您就可以找到几乎任何版本的Domino的Domino Designer帮助条目。

您也可以通过C API访问Domino,但不建议使用它。很乱。您还需要安装Domino / Lotus Notes客户端。

如果在同一台计算机上安装了Domino / Lotus Notes客户端且Domino服务器正在运行http,您也可以通过http执行此操作。这不会快得多。您可能还希望在Domino服务器上设置一些自定义http视图,以使您的生活更轻松。

答案 4 :(得分:2)

您可以使用Java或LotusScript创建Domino Web服务。然后使用C#访问Web服务。

我只做了一次,将Lotus Notes数据库中的数据读入另一台机器上运行的.NET应用程序。

编写和测试简单的Web服务 http://www.ibm.com/developerworks/lotus/library/web-services2/

当我找到一些时间时,我会写一个完整的例子: - )

答案 5 :(得分:1)

我曾经在Notes插件上工作了好几个月,是的,API可能令人抓狂。但是,我能够让它工作,所以我可以使用C#应用程序访问所有Notes信息(实际上,因为我正在编写一个插件,我让Notes通过它注册的C ++桥调用C#应用程序启动.ini文件)。他们在API中记录的某些方法实际上并不起作用,因此需要进行大量测试。有时你必须做一些代码体操...

答案 6 :(得分:1)

在那天我会推荐Proposion的N2N,但是自Quest收购Proposion以来,该产品已经消失。

也就是说,Proposion证明您可以安全地将Notes API包装在一组.Net类中。您可以在Bob Balaban's blog中找到相关信息。

答案 7 :(得分:1)

我知道这个线程已经过时了,但我通过Domino COM API对Domino API和典型的Notes LotusScript对象进行了大量工作。

Domino API的问题在于它通过COM进行的内存管理非常糟糕(如果在C#或VB中使用API​​等),它会导致内存泄漏并最终导致整个API和Notes客户端崩溃(即使您没有打开客户端,在API崩溃而不重新启动计算机或调用“nsd -kill”之后,您将无法启动它)。乐趣。

我发现通过P / Invoke在C#中使用Notes C API,您可以更好地管理内存资源,以便API不会导致可怕的内存泄漏和崩溃。我在C#中使用P / Invoke编写了一个部分包装器,它从notes.dll访问Notes C API。我对它的使用与尝试在Domino环境中工作无关,而是利用Notes程序集访问NSF文件以在C#环境中提取DXL信息。显然,您需要安装Notes客户端才能访问notes.dll和C API。但是我的Notes C API的C#包装器工作得很好,并且比安装Notes客户端时提供的Domino COM API更稳定。

我在Notes C API中使用C#(我只需要)实现的类是:

NotesSession(作为NotesRuntime) NotesDatabase的 NotesNote NotesItem NotesDXLExporter NotesNoteCollection

以及其他一些临时类,枚举和结构,用于处理从C API到C#的转换。

到目前为止我实现的类已经达到了我需要的Notes C API的目的。它们肯定可以扩展,但我没有尝试将整个API封装在C#P / Invoke包装器中。我还必须创建处理程序来处理可能存储在Notes文档中的OLE嵌入对象,并使用Windows IStorage对象从这些OLE对象中获取存储的数据。

注意:我可以稍后提供一些示例(由于专有原因,我必须重命名命名空间并概括代码),但我使用“Lotus C API Notes / Domino 8.5.2参考”创建了C#包装类NSF由IBM / Lotus提供(作为可下载的NSF)。使用C定义和类引用,我可以将它们转换为C#P / Invoke调用并将它们包装成更友好的C#类,然后表现得更像LotusScript类调用,但在C#中,并且实现的类管理和处理它们的内存所以从C#程序访问了数十万个文档后,整个事情都没有崩溃。 :)

答案 8 :(得分:0)

我个人会在LotusScript或Java中的Notes中使用本机。您可以比使用C#中的服务更容易在Notes中执行预定代理。

答案 9 :(得分:0)

我个人非常喜欢用于COM API的Domino包装.NET程序集。当您开发C#代码时,几乎可以想象您对正确的Notes IDE的梦想成真。但它有一些缺点,比如版本6.5(我没有尝试过更新),在LotusScript代码返回参数类型不匹配的情况下,许多情况下会导致应用程序崩溃。但这当然是由于COM的限制。

同时包装器不允许使用NotesUI类。但是,我使用来自非常旧的Notes COM API示例的反射来调用NotesUI类,并且它起作用。当我开发一个需要与Notes客户端UI交互的Outlook插件时,这很方便。我设法为UI类创建了一个简单的包装器。