2011-02-15 46 views
1

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

总结: 控制台应用程序创建一个窗口的形式。当窗体被加载(模态)时,我添加一个infopath控件(Microsoft.Office.InfoPath.FormControl)到这个窗口。那时我调用了infoPathControl.Open(myInfoPathFileStream)。所有这些都是在forloop中完成的。

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

试图(但失败了)解决方案

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

任何想法将不胜感激,因为我已经花了很多时间在这。

谢谢!

回答

1

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

1

不幸的是,你想要做的是在内部进行一项非常昂贵的工作,你可能更适合购买一个工具来为你做。这里有一个链接,将指向一个广为接受的工具,它可以满足您的需求。

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

让我知道这是否可以帮助你 - 作为一个软件工程师,我知道这违背了在你的一切,但你面对一个非常大的和强大的墙与这一个。