我有一些旧的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
答案 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
命名空间中的{。}}类。