COM 互操作对象在一个项目中引发 InvalidCastException,但在其他项目中不引发

Posted

技术标签:

【中文标题】COM 互操作对象在一个项目中引发 InvalidCastException,但在其他项目中不引发【英文标题】:COM interop object throws InvalidCastException in one project but not in other 【发布时间】:2010-11-09 16:12:35 【问题描述】:

我在我的测试 C# 解决方案中导入了一个 COM 对象。 一切正常,并继续这样做。

然后我在我的实际解决方案中导入了相同的 COM 对象,并作为测试实现了与测试项目中完全相同的行。 当我运行真正的项目时,我得到一个 InvalidCastException

无法将“CTWebReport.WebReportCOMClass”类型的 COM 对象转换为接口类型“CTWebReport.IWebReportCOM”。此操作失败,因为 IID 为“5DFA18E8-4E71-4ADC-A812-6B166C242561”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .

我在整个系统中搜索了对 interop 和 com 库的每个引用,其中包括我能找到的所有 bin 和 obj 文件夹。 除了原来的 COM 库,我将它们全部删除,并清理了我的回收站。 没有区别,完全一样的情况。测试项目有效,实际项目无效。

编辑 似乎 COM 在 winforms 应用程序中工作,但在我的类库中不起作用(由 asp.net mvc web 应用程序使用)。

我不知道下一步该做什么。有什么建议吗?

【问题讨论】:

我曾经遇到过类似的行为 - 问题是界面与自动化不兼容,并且我在不同的情况下打开或关闭了编组。它在编组关闭时工作正常,但在编组打开时无法检索接口。 想详细说明一下?在这两个项目中,编组都是由 .net 本身(自动生成的互操作类)完成的。 我尝试使用与自动化不兼容的接口来 CoCreateInstance 组件。首先它只是 regsvr32'd,我在 32 位 C++ 程序中调用了 CoCreateInstance() - 它工作正常。当我将组件放入 COM+(使其在单独的进程中运行)时,同一个 32 位程序中的 CoCreateInstance 现在返回 E_NOINTERFACE。 会是同样的情况吗?我刚刚发现,每当我尝试在 Web 应用程序中使用 COM 时,它都会失败,而在 winform 应用程序中,它似乎没有任何问题。 是的,可以是这个。它可能以某种方式取决于程序是否是多线程的。如果是 - 编组已打开。 【参考方案1】:

区别在于线程。 winform 线程从主线程执行代码,而 asp.net 没有。它是通过在 STAThread 中显式运行 COM 来解决的。

【讨论】:

老实说,不确定。 COM 是在我们印度部门的 Delphi 中生成的。现在我所要做的就是将 [STAThread] 属性显式添加到我的调用者。 另外,您的评论速度有多快!?过去几天你都在睡觉还是只是在看这个帖子? 快速评论只是巧合。你在哪里添加了属性? 如果你是在ASP.NET中运行,那么你可以在页面指令中添加AspCompat标签强制组件强制在 STA 模式下运行的页面。这也应该可以解决您的问题。 你确定吗?在 asp.net mvc 中,仅在完成所有其他工作后才加载视图,因此我认为当控制器委派其所有工作时不会考虑标签..【参考方案2】:

由于您的 COM 组件在 WinForm 应用程序中工作,但不在 ASP.NET 中,我认为您可能遇到了一些权限问题。您能否暂时提升运行 ASP.NET 的权限(例如管理员)并查看您是否可以执行该组件?

【讨论】:

是的,这是我检查的其中一项内容,但即使两者都以相同的权限运行,也没有改变任何事情。

以上是关于COM 互操作对象在一个项目中引发 InvalidCastException,但在其他项目中不引发的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 .NET 5 COM 互操作对象与 VB6 连接起来吗?

64 到 32 位互操作 - 如何?

Visual Studio 2010,TlbImp 在 2.0 项目中生成 .net 4.0 互操作

在 C++ 中使用 COM 互操作对象

如何通过 COM 互操作在 .NET 对象上调用静态方法?

COM 互操作中动态代码的内存泄漏