从 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
检查正在工作的机器并与不工作的机器进行比较。
我有一个天气监测产品(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
检查正在工作的机器并与不工作的机器进行比较。