1

我有一些旧的 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("", "");

这样你就没有智能感知,但所有属性和方法都可以在这里找到

4

1 回答 1

3

当您NoteSession使用关键字在 C# 中创建该类型的新实例时new,它将使用项目在构建时引用的 COM-interop dll。这与调用不完全相同,调用CreateObject不需要互操作 dll。C# 中更接近的等价物是:

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

或者,如果你真的需要做同样的事情,你总是可以添加对Microsoft.VisualBasic.dll库的引用,然后Microsoft.VisualBasic.Interaction.CreateObject从 C# 调用该方法。

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

于 2013-05-02T13:39:44.810 回答