2013-05-02 68 views
1

我有一些舊的VB代碼使用Lotus Notes這樣的作品,我已經重新編寫成C#發送郵件,但表現不同:電話LotusSession.GetDatabase工作在VB,但不是在C#

VB:

NotesSession = CreateObject("Notes.Notessession") 
    NotesDb = NotesSession.GetDatabase("", "") 

C#:

_notesSession = new NotesSession(); 
    _notesSession.Initialize(passwordString); 
    _notesDatabase = _notesSession.GetDatabase("", ""); 

在C#我需要初始化一個密碼NotesSession,其次它不會接受在運行時爲空字符串參數一。引發異常:「必須提供數據庫名稱」。

在VB和C#我指的是同一個COM:Lotus Domino的對象

我需要能夠調用GetDatabase不指定服務器和數據庫文件。

在此先感謝。

解決方案(謝謝你們):

 dynamic _notesSession = Activator.CreateInstance(Type.GetTypeFromProgID("Notes.NotesSession")); 
    _notesDatabase = _notesSession.GetDatabase("", ""); 

這種方式,你有沒有智能感知,但所有屬性和方法,可以發現here

回答

3

當使用在C#創建NoteSession類型的新實例new關鍵字,它將使用在構建時由項目引用的COM-interop dll。這與調用CreateObject並不完全一樣,它不需要interop dll。在C#中越接近相當於是:

Type t = Type.GetTypeFromProgID("Notes.Notessession"); 
_notesSession = Activator.CreateInstance(t); 

或者,如果你真的需要做的確切同樣的事情,你總是可以參考添加到Microsoft.VisualBasic.dll庫,然後調用從C#中Microsoft.VisualBasic.Interaction.CreateObject方法。

正如Richard在下面的評論中指出的那樣,您看到行爲有所不同的可能原因是您正在創建兩種不同類型的對象。假設在C#中調用new NotesSession時,它使用Lotus命名空間中的NotesSession類,而不是Notes命名空間中的類。

+2

重要的是要明白,Notes有兩組不同的非常相似的「後端類」。有一些OLE類植在'Notes.NotesSession'中,並且有一些COM類以「Lotus.NotesSession」爲根。舊的VB代碼使用OLE類,而不是COM類。正如我所說的,COM和OLE類 – 2013-05-02 13:52:17

+0

啊!非常好的說明,謝謝@RichardSchwartz,這樣更有意義,我對Notes並不熟悉,所以我沒有意識到這一點,我會更新我的答案。 – 2013-05-02 13:59:40

+0

謝謝你們。使我的一天。 – zmaster 2013-05-02 14:52:37

相關問題