我必须与第三方应用程序通信,唯一的方法是访问提供的 COM 组件。因为交互大约需要 3 分钟,所以必须在后台进行。所以我试图做的是使用选项“embedd interop-types”= true 添加对组件的引用,并创建一个通过接口读取非常基本数据的测试。记录在案的方法是遵循以下代码:
System sys = new System();
if(Convert.ToBoolean(sys.Initialize()) && Convert.ToBoolean(sys.Login("John Smith", out userInstance)))
Project proj = new Project();
if (Convert.ToBoolean(proj.Open(sys, m_projName, m_scenarioName)))
someValue = proj.Name;
在使用 BackgroundWorker 之前,这非常有效。然后我在第一行代码中收到以下错误:
无法将“System.__ComObject”类型的 COM 对象转换为接口类型“ICAPILib.System”。此操作失败,因为 IID 为“{1F5EB3E2-35F6-11D2-A191-0060083A260B}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:加载类型库/DLL 时出错。(来自 HRESULT 的异常:0x80029C4A (TYPE_E_CANTLOADLIBRARY))。
我已经尝试重新注册组件但没有任何成功。
当使用 BackgroundWorker 时,Thread Apartment Type 显然是 MTA。COM 组件的 ThreadingModel 设置为公寓。如果我正确理解了这篇文章 http://msdn.microsoft.com/en-us/library/eaw10et3.aspx ,则互操作编组应该负责访问对象。
有人知道我可以尝试做什么吗?