特别是,我必须以最快,最可靠的方式从Lotus Notes文件中提取所有消息和附件。可能相关的另一点是我需要从辅助线程执行此操作。
修改
感谢您的回答 - 两者都很好。我应该提供更多背景资料。
我们目前有一个使用Notes COM API的后台线程的WinForms应用程序。
然而它似乎不稳定。 (当然可能是我们做错了。)例如,我们发现我们必须在主线程上预先初始化Notes会话,否则在后台线程上调用session.CreateDXLExporter()会抛出异常。
答案 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类创建了一个简单的包装器。