1

我正在使用一个简单的控制台应用程序将 infopath 表单转换为 PDF 文件。这是我将如何处理此问题的简短摘要。

摘要: 控制台应用程序创建了一个窗口窗体。当表单被加载(模态)时,我将一个信息路径控件(Microsoft.Office.InfoPath.FormControl)添加到这个窗口。那时我调用 infoPathControl.Open(myInfoPathFileStream)。所有这些都是在一个 forloop 中完成的。

问题: 应用程序会随机抛出异常(灾难性故障、堆损坏等),甚至更好的是它偶尔会挂起而不会抛出错误。记录和调试让我相信它挂在 infoPathControl.Open(myInfoPathFileStream) 调用中。显然,对于自动化过程来说,这是不可接受的。

尝试(但失败)的解决方案

  • 我尝试将每个创建的表单包装在它自己的(STA)线程中并使用thread.join。由于 COM 的问题,这不起作用。
  • 我尝试将循环的每次迭代都包装在它自己的应用程序域中。这在一定程度上奏效了,但是由于 appDomains 的性质仍然是同步的,它不会解决挂起没有错误的问题。此外,奇怪的是,我似乎并不总是能够捕获 COM 对象引发的异常。
  • 最后,我尝试在表单线程上放置一个计时器,以便在计时器到期时抛出异常。到目前为止,我还无法证明这是否有效。

任何想法都将不胜感激,因为我已经为此花费了大量时间。

谢谢!

4

2 回答 2

1

不幸的是,您正在尝试做的事情将是一项极其昂贵的内部工作,您可能更适合购买一个工具来为您做这件事。这是一个链接,可将您指向一个被广泛接受的工具,该工具可以满足您的需求。

http://social.technet.microsoft.com/Forums/da-DK/sharepoint2010customization/thread/528c3459-074f-43f7-a7a1-d4a169b27c93

如果这对你有帮助,请告诉我——作为一名软件工程师,我知道这与你内心的一切都背道而驰,但你要面对一堵非常大而坚固的墙。

于 2012-03-01T01:59:15.923 回答
1

最后,解决方案是在它自己的可执行文件中运行 infopath 转换过程,并为成功、失败和特定类型的错误设置返回代码。然后由第二个具有超时的可执行文件调用它。如果转换在一段时间内没有成功,它将被调用的可执行文件杀死。这最终并不能解决 infopath 自动化库中的问题,但它完成了我们需要完成的工作,而不会失败。

于 2014-12-17T19:18:52.623 回答