【问题标题】:IBM Lotus Notes Domino DLLIBM Lotus Notes Domino DLL
【发布时间】:2014-07-09 20:54:45
【问题描述】:

当基于 NotesDXLExporter 类的对象在导出 389 条记录(较小的文档)后无法导出第 390 条记录时,Lotus Notes 中包含的 Domino 互操作 API 会导致内存不足异常)。

这是一个代码sn-p:

  1. 我初始化 NotesDXLExporter 类。

    NotesDXLExporter dxl1 = null;

  2. 然后我配置 NotesDXLExported 对象,如下所示:

    dxl1 = notesSession.CreateDXLExporter(); dxl1.ExitOnFirstFatalError = false; dxl1.ConvertNotesbitmapsToGIF = true; dxl1.OutputDOCTYPE = false;

  3. 然后我在使用 dxl1 类读取文档时执行如下所示的 for 循环(发生异常的行如下所示)。

    NotesView vincr = database.GetView(@"(AllIssuesView)"); //从 NSF 文件中查看 for (int i = 1; i

                    vincrdoc = vincr.GetNthDocument(i);
    
    
                        System.IO.File.WriteAllText(@"C:\Temp\" + i + @".txt", dxl1.Export(vincrdoc)); //OUT OF MEMORY EXCEPTION HAPPENS HERE WHEN READING A BIG DOCUMENT.
    
    
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex);
                }
    

我尝试使用不同版本的 Interop domino dll,但没有成功。

据我了解,我看到了一个 API 问题,但我不知道我是否遗漏了什么?

你能解释一下吗?

提前致谢。

分部

【问题讨论】:

    标签: interop lotus-notes com-interop lotus-domino interop-domino


    【解决方案1】:

    您还没有说您使用的是哪个版本的 Lotus Notes。鉴于 DXL 的历史,我会说您应该尽可能在最新版本的 Notes 上尝试您的代码。

    而且,我没有看到任何对 recycle() 的调用。未能为 Domino 对象调用 recycle() 会导致内存从 Domino 后端类泄漏,并且由于内存不足,这可能会导致您的问题。您也不应该使用 for 循环和 getNthDocument。您应该使用 getFirstDocument 和带有 getNextDocument 的 while 循环。您将获得更好的性能。将这两件事放在一起会导致您使用临时文档来保存 getNextDocument 的结果的常见模式,允许您回收当前文档,然后将临时文档分配给当前,这将是这样的(没有错误检查!)

    NotesView vincr = database.GetView(@"(AllIssuesView)"); //view from an NSF file 
    vincrdoc = vincr.getFirstDocument();
    while (vincrdoc != null)
    { 
       try {
           System.IO.File.WriteAllText(@"C:\Temp\" + i + @".txt", dxl1.Export(vincrdoc));     
       }
       catch(Exception ex)
       {
           Console.WriteLine(ex);
       }
       Document nextDoc = vincr.getNextDocument(vincrdoc);
       vincrdoc.recycle();
       vincrdoc = nextDoc;
    
    }
    

    【讨论】:

    • 感谢您的回答。不幸的是,我们使用的 API 版本没有 recycle 方法。我有一个 Interop.Domino.dll,大小为 240 KB,版本号为 1.2.0.0。另一个 Interop.Domino.dll 大小为 229 KB,与 1.2.0.0 版本相同。我应该使用不同的 API 版本吗?
    • 哦,哎呀!我忘了你正在使用互操作。我查看了代码,并认为它是 Java 而不是 C#。傻,因为里面有很多明显的 C#isms。 Interop 类没有 recycle() 方法,这实际上只是 Domino COM 类的填充程序。我对避免 getNthDocument 的建议在 C# 中仍然适用,但其余的都不是必需的。我已经看到了一些显式处理 Interop 对象的 C# 代码,但从我所读到的内容来看,它确实不是必需的,因为垃圾收集器应该这样做。
    • 关键不是 Interop DLL 版本,而是安装在您运行的机器上的 Notes 客户端的版本。 Interop DLL 只是一个薄层。所有实际逻辑都在核心 Notes DLL 中。 DXL 有很多错误,并且在核心代码中应用了很多修复,因此我强烈建议您尽可能在 Notes 9 上测试您的代码。
    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2014-08-02
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多