从 C# 实例化 COM 组件的 NOINTERFACE 异常

NOINTERFACE Exception instantiating a COM component from C#

我有一个天气监测产品(Boltwood Cloud Sensor II)供应商提供的 exe 文件“ClarityII.exe”。该应用程序提供用于显示和控制传感器状态的 GUI,并提供 COM 接口以与其他软件集成。到目前为止,我没有从供应商那里得到任何帮助。我相信它是用 VB6 编写的。

我正在尝试使用 VS2013 .NET 4.5.1 C# 程序中的 COM 接口。供应商提供了一个非常简单的 VB6 测试应用程序,可以正常工作。

我已将所需的 clarityII 引用添加到我的 C# 项目中。下面的简化代码编译,当我 运行 它按预期显示供应商的 GUI,但我得到下面的异常。

使用new创建cloudII时出现异常:

'System.InvalidCastException' 类型的未处理异常发生在 Interop1.exe

附加信息:无法将类型 'System.__ComObject' 的 COM 对象转换为接口类型 'ClarityII.CloudSensorII'。此操作失败,因为 IID 为“{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXX}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002(E_NOINTERFACE)).

可能是什么原因导致此错误?我认为互操作是由自动生成包装器的编译器为我完成的 Interop.ClarityII.dll?

我有以下骨架

using System;
using ClarityII;

class MainClass 
{
  [STAThread]
  public static void Main(string[] args) 
  { 
    ClarityII.CloudSensorII cloudII;
    cloudII = new ClarityII.CloudSensorII();
  }
}

PS 编辑: 我只是 运行 我的 C# 程序在另一台安装了相同 ClarityII.exe 的 PC 上。在那台 PC 上,当我实例化 COM 对象时没有异常。我也可以访问属性确定。有什么想法可能会在我的开发 PC 上损坏吗?

我的猜测...检查您的开发机器上的 ClarityII 类型库以确保它已正确注册。而且,特别是因为它是 EXE 到 EXE COM,请检查接口(CloudSensorII?)是否已在您的开发机器上注册。既然是EXE to EXE,就会有编组。当 Office 未在主机上正确注册并且未注册某些接口时,我过去在使用 Office 接口时遇到过问题。在那些情况下,我有时会收到 E_NOINTERFACE 错误,IIRC。

有一个注册表子项HKEY_CLASSES_ROOT\Interface

在 64 位机器上有一个用于 32 位的:

HKEY_CLASSES_ROOT\Wow6432Node\Interface

检查正在工作的机器并与不工作的机器进行比较。