C# 对LotusSession.GetDatabase的调用在VB中有效,但在C中无效#

C# 对LotusSession.GetDatabase的调用在VB中有效,但在C中无效#,c#,vb.net,lotus-domino,C#,Vb.net,Lotus Domino,我有一些旧的VB代码,可以使用Lotus Notes发送邮件,我已将其重新写入C#,但其行为不同: VB: C#: 首先,在C#中,我需要用密码初始化NotesSession,其次它在运行时不接受空字符串参数。引发异常:“必须提供数据库名称” 在VB和C中,我都提到同一个COM:LotusDomino对象 我需要能够在不指定服务器和数据库文件的情况下调用GetDatabase 提前谢谢 解决方案(谢谢大家): 通过这种方式,您没有intellisense,但在C#中创建NoteSession类型

我有一些旧的VB代码,可以使用Lotus Notes发送邮件,我已将其重新写入C#,但其行为不同:

VB:

C#:

首先,在C#中,我需要用密码初始化NotesSession,其次它在运行时不接受空字符串参数。引发异常:“必须提供数据库名称”

在VB和C中,我都提到同一个COM:LotusDomino对象

我需要能够在不指定服务器和数据库文件的情况下调用GetDatabase

提前谢谢

解决方案(谢谢大家):


通过这种方式,您没有intellisense,但在C#中创建
NoteSession
类型的新实例时,可以找到所有属性和方法。使用
new
关键字,它将使用项目在生成时引用的COM互操作dll。这与调用
CreateObject
并不完全相同,后者不需要互操作dll。C#中更接近的等价物是:

Type t = Type.GetTypeFromProgID("Notes.Notessession");
_notesSession = Activator.CreateInstance(t);
或者,如果确实需要执行完全相同的操作,您可以始终添加对
Microsoft.VisualBasic.dll
库的引用,然后从C#调用
Microsoft.VisualBasic.Interaction.CreateObject
方法


正如Richard在下面的评论中指出的,您看到行为差异的可能原因是您正在创建两种不同类型的对象。大概,当您在C#中调用
newnotessession
时,它使用的是
Lotus
名称空间中的
notession
类,而不是
Notes
名称空间中的类。

重要的是要理解,Notes有两组非常相似的“后端类”。有以“Notes.notession”为根的OLE类,也有以“Lotus.NotesSession”为根的COM类。旧的VB代码使用的是OLE类,而不是COM类。正如我所说,COM和OLE类是相似的,但不完全相同。啊!很好的澄清。谢谢RichardSchwartz。这更有意义。我不熟悉笔记,所以我没有意识到这一点。我会更新我的答案。谢谢大家。这让我很开心。
    _notesSession = new NotesSession();
    _notesSession.Initialize(passwordString);
    _notesDatabase = _notesSession.GetDatabase( "", "");
     dynamic _notesSession = Activator.CreateInstance(Type.GetTypeFromProgID("Notes.NotesSession"));
     _notesDatabase = _notesSession.GetDatabase("", "");
Type t = Type.GetTypeFromProgID("Notes.Notessession");
_notesSession = Activator.CreateInstance(t);