Исключение NOINTERFACE создание экземпляра компонента COM из C#

У меня есть exe файл » ClarityII.exe», поставляемый поставщиком продукта для мониторинга погоды (Boltwood Cloud Sensor II). Приложение предоставляет графический интерфейс для отображения и управления состоянием датчика, а также предоставляет COM-интерфейс для интеграции с другим программным обеспечением. Пока я не получаю никакой помощи от поставщика. Я считаю, что это было написано в VB6.

Я пытаюсь использовать COM-интерфейс из программы VS2013 .NET 4.5.1 C#. Поставщик поставил очень простой тестовый ap VB6, который отлично работает.

Я добавил требуемую ссылку clarityII к моему проекту c#. Приведенный ниже код компилируется, и при его запуске графический интерфейс поставщика отображается должным образом, но я получаю исключение ниже.

Исключение возникает при создании cloudII с помощью new:

Необработанное исключение типа ‘ System.InvalidCastException ‘ произошло в Interop1.исполняемый

Дополнительная информация: невозможно привести COM-объект типа ‘ System.__ComObject ‘to interface type’ ClarityII.CloudSensorII’. Эта операция не удалась, поскольку вызов QueryInterface компонента COM для интерфейса с IID ‘{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX} ‘ не удался из-за следующей ошибки: такой интерфейс не поддерживается (исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).

Что может быть причиной этой ошибки? I thought the interop was done for me by The compiler automatically producing The wrapper Interop.ClarityII.dll?

У меня есть следующий скелет

using System;
using ClarityII;

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

PS edit:
Я только что запустил свою программу C# на другом компьютере с той же ClarityII.exe установлен. На этом ПК нет исключения, когда я создаю экземпляр COM-объекта. Я также могу получить доступ к свойствам OK. Есть идеи, что может быть сломано на моем компьютере dev?

1 ответ

  1. Мое предположение… Проверьте библиотеку типов ClarityII на компьютере разработчика, чтобы убедиться, что она зарегистрирована правильно. И, тем более, что это EXE к EXE COM, проверьте, чтобы увидеть, если интерфейс (CloudSensorII ?) зарегистрирован на вашем компьютере Dev. Так как это EXE в EXE, будет маршалинг. В прошлом у меня были проблемы с использованием интерфейсов Office, когда Office неправильно регистрировался на хост-компьютере и не регистрировал некоторые интерфейсы. В этих случаях я иногда получал ошибки E_NOINTERFACE, IIRC.

    Есть раздел реестра HKEY_CLASSES_ROOT\Interface

    и есть один для 32-бит на 64-битных машинах:

    HKEY_CLASSES_ROOT\Wow6432Node \ интерфейс

    Проверьте на машине, которая работает и сравнить с тем, что не является.