调用LotusSession.GetDatabase在VB中工作但不在C#中工作

时间:2013-05-02 13:08:44

标签: c# vb.net lotus-domino

我有一些旧的VB代码来发送使用Lotus Notes的邮件,我将其重新写入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 Objects

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

提前致谢。

解决方案(谢谢大家):

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

这样您就没有智能感知,但可以找到所有属性和方法here

1 个答案:

答案 0 :(得分:3)

使用NoteSession关键字在C#中创建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方法。

正如理查德在下面的评论中所指出的,你看到行为上的差异的可能原因是因为你正在创造两种不同类型的对象。据推测,当您在C#中调用new NotesSession时,它使用NotesSession命名空间中的Lotus类,而不是Notes命名空间中的{。}}类。