16

特に、ロータス ノーツ ファイルからすべてのメッセージと添付ファイルを最速かつ最も信頼できる方法で抽出する必要があります。関連する可能性のあるもう 1 つのポイントは、セカンダリ スレッドからこれを行う必要があることです。

編集

回答ありがとうございます - どちらも良いです。背景情報をもっと提供する必要があります。

現在、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 でノーツ セッション (開始点) を取得するには、次を使用できます。

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 を使用できます。「COM を介した Domino オブジェクトへのアクセス」で Google 検索を行うだけで、Domino のほぼすべてのバージョンの Domino Designer ヘルプ エントリが見つかります。

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

当時、私はProposionからN2Nを推奨していましたが、QuestがProposionを買収してから、その製品はなくなりました。

That said, Proposion was proof that you can wrap the Notes API in a set of .Net classes safely. You can find some info on that in Bob Balaban's blog.

于 2008-12-23T13:03:54.917 に答える
1

私は数か月前に Notes プラグインに取り組みましたが、確かに API は気が遠くなる可能性があります。しかし、C# アプリケーションを使用してすべての Notes 情報にアクセスできるように動作させることができました (実際、私はプラグインを作成していたので、C++ ブリッジを介して C# アプリケーションに Notes を呼び出しました。スタートアップ .ini ファイル)。ただし、API で文書化されている特定のメソッドは実際には機能しないため、多くのテストが必要です。時々、コード体操をしなければなりません...

于 2008-09-23T18:42:34.950 に答える
1

このスレッドが古いことは承知していますが、私はドミノ API と、ドミノ COM API を介した一般的なノーツ LotusScript オブジェクトについて多くの作業を行ってきました。

Domino API の問題は、COM を介したメモリ管理がひどいことであり (C# や VB などで API を使用している場合)、メモリ リークが発生し、最終的に API 全体と Notes クライアントがクラッシュします (クライアントを開いていないと、API がクラッシュした後にコンピューターを再起動するか、「nsd -kill」を呼び出さない限りクライアントを起動できません)。楽しい。

P/Invoke を介して C# 内で Notes C API を使用すると、API が恐ろしいメモリ リークやクラッシュを引き起こさないように、メモリ リソースをより適切に管理できることがわかりました。P/Invoke を使用して、notes.dll から Notes C API にアクセスする部分的なラッパーを C# で作成しました。私の使用は、Domino 環境内での作業とは関係ありませんが、Notes アセンブリを使用して NSF ファイルにアクセスし、C# 環境内で DXL 情報を抽出するために使用します。明らかに、notes.dll と C API にアクセスするには、Notes クライアントをインストールする必要があります。しかし、ノーツ C API の私の C# ラッパーはうまく機能し、ノーツ クライアントのインストール時に提供されるドミノ 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 オブジェクトから格納されたデータを取得するためのハンドラも作成する必要がありました。

注: 後でいくつかのサンプルを提供できます (独自の理由により、名前空間の名前を変更し、コードを一般化する必要があります)。 IBM/Lotus によって (ダウンロード可能な NSF として) 提供されます。C 定義とクラス参照を使用して、それらを C# P/Invoke 呼び出しに変換し、より使いやすい C# クラスにラップすることができました。これにより、LotusScript クラス呼び出しのように動作しますが、C# 内では、実装されたクラスがメモリを管理および破棄します。 C# プログラムから何十万ものドキュメントにアクセスした後でも、全体がクラッシュすることはありません。:)

于 2016-04-09T12:31:00.653 に答える
0

個人的には、Domino でラップされた COM API 用の .NET アセンブリが非常に気に入っています。C# コードを開発するとき、適切な Notes IDE についての夢が現実になったことは想像に難くありません。しかし、バージョン 6.5 (私はそれより新しいものは試していません) のように、いくつかの欠点があります。多くの場合、LotusScript コードがパラメーターの型の不一致を返すと、アプリケーションがクラッシュします。しかし、これはもちろん COM の制限によるものです。

同時に、ラッパーは NotesUI クラスの操作を許可しません。ただし、非常に古い Notes COM API の例からのリフレクションを使用して NotesUI クラスを呼び出したところ、うまくいきました。Notes クライアント UI との対話が必要な Outlook プラグインを開発したときに便利でした。UI クラスの単純なラッパーも作成できました。

于 2010-10-22T09:48:33.163 に答える
0

個人的には、LotusScript または Java のノーツでネイティブにこれを行います。C# のサービスよりもはるかに簡単に、Notes でスケジュールされたエージェントを実行できます。

于 2009-08-21T17:20:42.477 に答える