16

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

编辑

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

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

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

4

10 回答 10

6

我真的很讨厌 NotesSession COM 对象。

除了初始化的线程之外,您不能在另一个线程中使用它。.NET 中的线程是纤程,真正的底层线程可能随时发生变化。

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

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()

那些是你的朋友。

干杯!

于 2010-07-16T17:19:24.113 回答
3

可以在此处找到 Lotus Notes COM Api 参考

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

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

我通常用 C# 编程,为了使用 COM 我更喜欢 VB.Net

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

于 2008-10-22T16:06:40.180 回答
2

看一下 NotesSQL:

http://www.ibm.com/developerworks/lotus/products/notesdomino/notessql/

于 2008-09-05T02:42:10.990 回答
2

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

您也可以通过 C API 访问 Domino,但不推荐这样做。很乱。您还需要安装 Domino / Lotus Notes 客户端。

如果您没有在同一台机器上安装 Domino / Lotus Notes 客户端,并且 Domino 服务器正在运行 http,您也可以通过 http 进行。这不会那么快。您可能还希望在 Domino 服务器上设置一些自定义 http 视图,以使您的生活更轻松。

于 2008-09-08T21:29:26.197 回答
2

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

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

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

当我有时间我会写一个完整的例子:-)

于 2008-09-16T12:57:53.613 回答
1

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

于 2008-09-23T18:42:34.950 回答
1

过去我会从 Proposion 推荐 N2N,但自从 Quest 收购 Proposion 后,该产品就已经消失了。

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

于 2008-12-23T13:03:54.917 回答
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 不会导致可怕的内存泄漏和崩溃。我使用 P/Invoke 在 C# 中编写了一个部分包装器,它从 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 Reference”NSF 创建了 C# 包装器类,即由 IBM/Lotus 提供(作为可下载的 NSF)。使用 C 定义和类引用,我可以将它们转换为 C# P/Invoke 调用并将它们包装到更友好的 C# 类中,然后它们的行为更像 LotusScript 类调用,但在 C# 中,并且实现的类管理和处置它们的内存,所以从 C# 程序访问数十万个文档后,整个事情不会崩溃。:)

于 2016-04-09T12:31:00.653 回答
0

我个人会在 LotusScript 或 Java 的 Notes 中进行本机操作。与 C# 中的服务相比,您可以在 Notes 中执行计划代理更容易。

于 2009-08-21T17:20:42.477 回答
0

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

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

于 2010-10-22T09:48:33.163 回答