2012-04-17 2 views
1

Мы построили .NET-сервер COM/Excel RTD Server (.NET Assembly), который использовался в течение многих лет на разных машинах (т. Е. Мы знаем, что он работает, и наш стандартный метод его установки работает). У нас есть пользователь, который установил этот RTD-компонент на другой машине и у него проблемы с его бесперебойной работой. Я считаю, что проблема связана с Interop.Microsoft.Office.Interop.Excel.dll каким-то образом либо несовместима с этой машиной, либо неправильно зарегистрирована. Вот конкретные детали:Ошибки .NET RTD/COM Excel на одном компьютере пользователя?

Хотя RTD ссылки работают в какой-то степени, мы видим, эта ошибка часто регистрируется с помощью нашего приложения:

RTDServer.NotifyExcel(): Error notifying Excel, ex=System.InvalidCastException: 
Unable to cast COM object of type 'System.__ComObject' to interface type 
'Microsoft.Office.Interop.Excel.IRTDUpdateEvent'. This operation failed because 
the QueryInterface call on the COM component for the interface with 
IID '{A43788C1-D91B-11D3-8F39-00C04F3651B8}' failed due to the following error: 
Library not registered. (Exception from HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED)).  
at Microsoft.Office.Interop.Excel.IRTDUpdateEvent.UpdateNotify()  
at EZomsRTDServer.RTDServer.NotifyExcel() 

Когда я был поиск неисправностей на компьютере пользователя, я проверил, есть ли наши компонент был зарегистрирован в COM правильно. Мы запускаем эту команду, чтобы зарегистрировать наш компонент с COM:

C:\EZomsRTD\regasm EZomsRTDServer.dll /codebase "c:\EZomsRTD\EZomsRTDServer.dll" 
C:\EZomsRTD\regasm EZomsRTDServer.dll /tlb 

Выполнение этих команд на компьютере пользователя производит эту ошибку Regasm:

Type library exporter warning: Referenced type is defined 
in managed component, which is imported from a type library 
that could not be loaded because it was not registered 
(type: 'Microsoft.Office.Interop.Excel.IRtdServer'; component: 
'C:\EZomsRTD\Interop.Microsoft.Office.Interop.Excel.dll'). 
Assembly exported to 'C:\EZomsRTD\EZomsRTDServer.tlb', and the type 
library was registered successfully 

(Файл: Interop.Microsoft.Office.Interop.Excel. dll находится в той же папке, что и наш компонент.)

Возможно, это связано с тем, что существует другая версия сборки Interop.Excel, зарегистрированная в GAC этого аппарата? Любые другие возможные области для расследования?

Примечание: Пользователь имеет Windows XP и Excel 2003.

Заранее спасибо за любую помощь (тот же профиль, как и его предыдущей машиной, которая работала.).

ответ

4

interface with IID '{A43788C1-D91B-11D3-8F39-00C04F3651B8}

Это интерфейс IRTDUpdateEvent. Он действительно имеет запись в HKCU \ Interfaces, которая объявляет стандартный маршаллер. Для этого требуется библиотека типов, LIBID - {00020813-0000-0000-C000-000000000046}.

Что сообщение об ошибке сообщает вам, что в реестре на этом компьютере отсутствует раздел реестра HKCR\TypeLib\{00020813-0000-0000-C000-000000000046} или один из его подразделов. Это может быть связано с тем, что у него установлена ​​старая версия Office, но это было бы очевидно. Простое повреждение реестра является основной причиной таких неудач. Лучше всего зацепить машину и заставить ее перестать тратить время. Переустановите Office, если это почему-то непрактично. Попытка исправить ключ реестра должна быть вашим последним вариантом, этот вид ущерба редко изолирован.

+0

Спасибо, Ханс. Мне нравится комментарий: «Лучше всего заколоть машину и перестать тратить время на все». Я желаю, чтобы это было так просто. Это внешние клиенты (не внутренние пользователи) ... Но я думаю, что это, вероятно, будет сообщение, которое я доставляю (в более политическом плане). –

+0

Привет, Ханс - прочитав сообщение, я проверил машину пользователя, и на самом деле у него были записи реестра для IRTDUpdateEvent, а также HKCR \ TypeLib \ {00020813-0000-0000-C000-000000000046} в реестре. Значение IRTDUpdateEvent \ TypeLib \ Version было равным 1,5, и когда я проверил HCKR \ ... \ {0002 ... \ 1.5, он, казалось, был в порядке - имел подразделы с InteropAssembly, а также win32, которые выглядели в порядке. Пользователь запускает Excel 2003. Мы собираемся обновить его до 2007 года. Может быть, это проблема, которую мы разработали и скомпилировали на машинах с использованием Excel 2007? –

+0

IRTDUpdateEvent зарегистрирован только для Office 2007, поэтому я не могу предсказать, что произойдет, когда вы попробуете 2003. Версия библиотеки типов для 2007 года - 1.6.Вы можете потратить больше времени на утилиту ProcMon от SysInternals, вы увидите, что она ищет библиотеку типов. –