Infopath FormControl挂在control.open上

时间:2011-02-15 16:33:33

标签: c# multithreading com interop infopath-2007

我正在使用一个简单的控制台应用程序将infopath表单转换为PDF文件。以下是我如何解决这个问题的简要总结。

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

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

尝试(但失败)解决方案

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

任何想法都会受到赞赏,因为我已经花了很多时间在这上面。

谢谢!

2 个答案:

答案 0 :(得分:1)

不幸的是,你要做的事情是内部成本极高,你可能更适合购买工具来为你做。这是一个链接,它将指向一个广泛接受的工具,可以完成您正在寻找的工作。

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

让我知道这是否有助于你 - 作为一名软件工程师,我知道这违背了你内心的一切,但是你正面对着一个非常强大的墙。

答案 1 :(得分:1)

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