Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C与Lotus Notes交互的最佳方式和推荐做法是什么#_C#_Interop_Lotus Notes - Fatal编程技术网

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

C# 从C与Lotus Notes交互的最佳方式和推荐做法是什么#,c#,interop,lotus-notes,C#,Interop,Lotus Notes,特别是,我必须以最快、最可靠的方式从LotusNotes文件中提取所有消息和附件。另一点可能是相关的,我需要从辅助线程执行此操作 编辑 谢谢你的回答,这两个都很好。我应该提供更多的背景资料 我们目前有一个WinForms应用程序,其后台线程使用Notes COM API 然而,它似乎是不稳定的。(当然可能是我们做错了什么。)例如,我们发现必须在主线程上预初始化Notes会话,否则在后台线程上调用session.CreateDXLExporter()会引发异常。查看NotesSQL: 如果在同一台

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

编辑

谢谢你的回答,这两个都很好。我应该提供更多的背景资料

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


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

查看NotesSQL:


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

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


如果您没有在同一台机器上安装Domino/Lotus Notes客户端,并且Domino服务器正在运行http,那么您也可以通过http执行此操作。这将不会像现在这样快。您可能还希望在Domino服务器上设置一些自定义http视图,以简化您的工作。

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

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

编写和测试简单的Web服务


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

前一段时间我在一个Notes插件上工作了几个月,是的,API可能会让人发疯。但是,我能够让它工作,所以我可以使用C语言应用程序访问所有的注释信息(实际上,因为我正在编写插件,我有注释通过C++桥调用到C应用程序,它在启动。ini文件中注册)。但是,他们在API中记录的某些方法实际上不起作用,因此需要进行大量测试。有时您必须做一些代码练习…

可以找到LotusNotesComAPI参考

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

Dim oSess As Object = Nothing
oSess = CreateObject("Notes.NotesSession")
我通常用C#编程,为了使用COM操作,我更喜欢VB.Net


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

早在那天,我就从Proposion推荐N2N,但该产品自Quest收购Proposion后就消失了


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

我个人会在LotusScript或Java的Notes中本机完成这项工作。在Notes中执行计划代理比在C#中执行服务容易得多。

我真的很讨厌NotesSession COM对象

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

因此,我建议在使用块中以这种方式使用它:

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

那些是你的朋友


干杯

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


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

我知道这个线程很旧,但我通过Domino COM API使用了很多Domino API和典型的Notes LotusScript对象

dominoapi的问题是,它通过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环境中工作无关t、 但是,要使用Notes程序集访问NSF文件,以便在C#环境中提取DXL信息,显然,您需要安装Notes客户端才能访问Notes.dll和C API。但是,我的Notes C API C#包装器工作得很好,并且比您使用时提供的Domino COM API更稳定暂停Notes客户端

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

NotesSession(作为NotesRuntime) NotesDatabase 便签 NotesItem NotesDxExporter NotesNoteToCollection

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

到目前为止,我实现的类已经达到了Notes C API所需要的目的
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