【发布时间】:2016-09-13 03:21:20
【问题描述】:
我正在从 C# 应用程序调用 COM DLL。 DLL 是应用程序的 SDK。当从应用程序本身调用它时,它可以正常工作,所以我很高兴它安装得很好。我试图从 C# 控制台应用程序调用它,当我尝试创建在 DLL 中定义的对象时出现以下错误:
System.Runtime.InteropServices.COMException: CoInitialize 尚未完成 叫。 (来自 HRESULT 的异常:0x800401F0 (CO_E_NOTINITIALIZED))
如何从 C# 调用 CoInitialize,我什至应该这样做吗?根据我的阅读,这应该是为 C# 应用程序自动完成的。此外,我正在运行的代码来自供应商的示例文件,因此大概应该是有效的。
请注意,供应商不再可用,因此明显的第一步不是一个选项!我真的只是在寻找有关为什么从 .Net 语言调用 COM DLL 会引发此错误的任何一般性建议。
【问题讨论】:
-
这不太可能,CLR 总是 为任何托管线程调用 CoInitialize()。否则对调用 CoUninitialize() 的代码没有真正的保护。当检测到错误的公寓状态时,编写不佳的 COM 组件可能会执行此操作。顺便说一句,一个主要的错误,但并非完全不常见,COM 公寓是出了名的知之甚少。你必须让它保持快乐,可能通过将 [STAThread] 属性放在你的 Main() 方法上。胡思乱想,用电话获取事实。
-
是的,这就是为什么我想知道我是否应该尝试调用它 - 我读到的所有内容都暗示它已经有效地完成了。不幸的是,我已经尝试过使用 STAThread 属性,但它没有帮助。我很清楚 COM 的内部结构,知道下一步该尝试什么。
-
每个人都知道如何使用电话,我们无法帮助您拨打电话。确保有一个可以演示问题的小型重现项目。你没有努力给我们看,无论你打电话给谁都会坚持要一个,否则他们会很快挂断电话。
-
这实际上是一个死产品,打电话给供应商不是一种选择(否则我会先去找他们!)
-
“当从应用程序本身调用时,它可以正常工作” - 什么样的应用程序,WinForms?也许,您需要一个带有实际消息循环的 STA 线程来使该组件工作。从here 尝试
MessageLoopApartment。