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

时间:2016-11-07 04:17:30

标签: c# com com-interop

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

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

我已经为我的C#项目添加了所需的clarityII参考。下面的简化代码编译,当我运行它时,供应商的GUI按预期显示,但我在下面得到例外。

使用new:

创建cloudII时会发生异常

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

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

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

我有以下骨架

using System;
using ClarityII;

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

PS编辑: 我刚刚在安装了相同ClarityII.exe的另一台PC上运行了我的C#程序。在那台PC上,当我实例化COM对象时没有异常。我也可以访问属性OK。什么想法可以在我的开发PC上被打破?

1 个答案:

答案 0 :(得分:0)

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

有一个注册表子项HKEY_CLASSES_ROOT \ Interface

在64位计算机上有一个32位的位:

HKEY_CLASSES_ROOT \ Wow6432Node \接口

检查正在运行的机器并与未运行的机器进行比较。