Прерывистая ошибка E_NOINTERFACE из C # / VB.Net DLL, подключающихся к C ++ ActiveX Exe - PullRequest
0 голосов
/ 13 января 2012

Я пытаюсь выяснить, почему происходит эта ошибка, и определить, можно ли ее предотвратить.

Итак, все это в VS2008, работающем под управлением Windows XP Pro SP3. Я пишу библиотеки плагинов панели инструментов для картографического приложения под названием FalconView 4.1.1.6. FalconView (fvw.exe) является приложением activex. Панели инструментов в целом работают нормально, за исключением случайной боли в шее (полученное сообщение об ошибке находится в конце этого вопроса, поскольку оно довольно длинное).

Иногда я могу вызвать это сообщение об ошибке, установив на тестовый ноутбук выпускную версию нашего программного обеспечения, заменив DLL выпуска на DLL отладки (для тестирования), удалив панель инструментов, а затем установив следующую версию панели инструментов , Бум, есть ошибка. Ошибка также возникает при записи и отладке, но менее предсказуемо. Я могу исправить это на моем компьютере разработчика, удалив ссылки на fvw из проекта, выйдя из vs2008, отменив регистрацию всех копий Interop.fvw.dll (созданного из tlb-файла, предоставленного FalconView), запустив «fvw / regserver», перезагрузив проект и добавление Interop.fvw.dll обратно в проект. Какая боль! Что здесь происходит? Есть ли способ предотвратить это?

Спасибо!

Ошибка в вопросе: System.InvalidCastException: невозможно преобразовать COM-объект типа 'fvw.MapClass' в интерфейс типа 'fvw.IMap'. Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{E353BC6C-E8AB-11D3-80B9-00C04F60B086}' завершился ошибкой из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) , at System.RuntimeType.InvokeDispMethod (имя строки, BindingFlags invokeAttr, цель объекта, аргументы объекта [], логическое значение [] byrefModifiers, культура Int32, строка [] namedParameters) в System.RuntimeType.InvokeMember (имя строки, BindingFlags bindingFlags, связыватель связывания, объектная цель, Object [] provideArgs, модификаторы ParameterModifier [], CultureInfo culture, String [] namedParams) в System.RuntimeType.ForwardCallToInvokeMember (String memberName, флаги BindingFlags, объектная цель, Int32 [] aWrapperTypes, MessageData & msgData) на fvw.MapClass.GetElevation (двойной лат, двойной лон, Int32 и высота) at Toolbar.rpuav_com.SendElevationData (станция-концентратор)

Обратите внимание, что {E353BC6C-E8AB-11D3-80B9-00C04F60B086} находится в реестре, когда я его ищу.

Ответы [ 4 ]

2 голосов
/ 19 января 2012

Uggg ... Я действительно надеялся, что я не смогу ответить на свой вопрос.Как-то так неправильно.

Так или иначе, проблема была в использовании файла Interop.fvw.dll.Мы должны использовать тот, который поставляется с FalconView (построен с помощью также предоставленного fvw.tlb).Наш проект ссылается на то, что dll и Visual Studio копируют его в нашу папку выпуска при создании версии выпуска нашего плагина и в папку Program Files, когда мы отлаживаем.Каким-то образом, и я не понимаю этого, генерируется новый файл Interop.fvw.dll (возможно, стажер, другой сотрудник или просто волшебник ??), и кровавая штука «застревает» в проблемных проектах.

Как я могу сказать, что новая dll взаимодействия перегенерирована?Токен открытого ключа - все нули, в то время как один из создателей FalconView имеет фактическое число.Теперь, если только они подпишут свою сборку.

Исправление для меня:

  1. удалите нарушающий Interop.fvw.dll из ссылок проекта
  2. сохраните проект и выйдите из Visual Studio
  3. в папке «Program Files» проекта, запустите «regasm / u Interop.fvw.dll»
  4. , попробуйте запустить «fvw / regserver»
  5. перезагрузите проект и снова обратитесь к соответствующему FalconView Interop.fvw.dll
  6. очистите сборку проекта, а затем восстановите

Спасибо всем за помощь!Очень ценится!

1 голос
/ 16 января 2012

Иногда я могу вызвать это сообщение об ошибке, установив выпускную версию нашего программного обеспечения на тестовом ноутбуке, заменив выпускную DLL на DLL отладки (для целей тестирования), удалив панель инструментов и установив следующую версиюпанели инструментов.Boom, есть ошибка.

Идентификаторы GUID, которые экспортер библиотеки типов (и Visual Studio) генерируют для идентификатора библиотеки типов и идентификаторов классов, используют версию сборки как часть хэша.Поэтому, если ваша версия сборки изменится (даже если это просто номер сборки или номер редакции), это изменит эти GUID.Вы определенно должны следить за этим, если ваш AssemblyVersionAttribute установлен на автоматически сгенерированный номер версии (например, 1.0. *).

Чтобы избежать этой проблемы, либо установите в вашей сборке статический номер версии.или укажите свои собственные GUID, используя атрибут [Guid] в своих классах и интерфейсах.

0 голосов
/ 15 января 2012

Я собираюсь выйти на конечность и сказать, что ошибка E_NOINTERFACE возникла из-за попытки перенаправить объект из одного потока в другой.

Убедитесь, что прокси / заглушка DLL зарегистрирована для интерфейса, который вы пытаетесь маршалировать.

0 голосов
/ 13 января 2012

Что-то выбрасывает / возвращает E_NOINTERFACE, предположительно, потому что запрошенный интерфейс не реализован.Как правило, это происходит, когда вы QueryInterface из объекта, который не является NULL, но который не реализует интерфейс.То есть он полностью зависит от приложения и вряд ли связан с настройками реестра.Поскольку это ваше приложение, вы можете отлаживать и видеть, что именно вы запрашиваете для fvw.IMap и почему оно не отображает рассматриваемый интерфейс.

...