【问题标题】:Call to LotusSession.GetDatabase works in VB but not in C#调用 LotusSession.GetDatabase 在 VB 中有效,但在 C# 中无效
【发布时间】:2013-05-02 13:08:44
【问题描述】:

我有一些旧的 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 对象

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

提前致谢。

解决方案(谢谢大家):

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

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

【问题讨论】:

    标签: c# vb.net lotus-domino


    【解决方案1】:

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

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

    或者,如果您确实需要完全相同做同样的事情,您可以随时添加对Microsoft.VisualBasic.dll 库的引用,然后从C# 中调用Microsoft.VisualBasic.Interaction.CreateObject 方法。

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

    【讨论】:

    • Notes 有两组截然不同的非常相似的“后端类”,这一点很重要。 OLE 类植根于“Notes.NotesSession”,COM 类植根于“Lotus.NotesSession”。旧的 VB 代码使用的是 OLE 类,而不是 COM 类。正如我所说,COM 和 OLE 类相似——但不相同。
    • 啊!出色的澄清。谢谢@RichardSchwartz。这更有意义。我不熟悉Notes,所以我没有意识到这一点。我会更新我的答案。
    • 谢谢大家。这让我很开心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多