Обновлено с более подробной информацией по отладке
Я использую проприетарный программный пакет, для которого у меня нет исходного кода, и он имеет интерфейс плагина на основе COM.У меня есть сборка .NET, которая видна в COM, что приложение успешно загружается на один компьютер, но не на другой.
Последние два дня я работаю над этой проблемой и чувствую, чтобесцельно бродить по ландшафту COM.В системе, которая не загружает мой плагин, когда я использую regasm /codebase /tlb
, tlb генерируется и регистрируется успешно.
Когда я смотрю на единственный доступный мне файл журнала, он упоминает, что он может 't создать объект и возвращает код ошибки 0x80040154.
Я не могу понять, почему объект не может быть создан, и я надеюсь, что кто-то может предложить некоторые стратегии отладки.Вот что я уже безуспешно попробовал:
- скопировать мою DLL и ее зависимости с рабочего компьютера на нерабочий компьютер
- с установкой VS2010 на нерабочем компьютере(на рабочем компьютере он был установлен)
- сравнивая результаты Dependency Walker для моей DLL и ее зависимостей на обоих компьютерах (они были идентичны)
- использовал ListDLL.Обе системы загружают одинаковые библиотеки DLL
- , запускают Process Monitor и фильтруют по CLSID для сборки при запуске
regasm /codebase /tlb
.Оба журнала были идентичны за исключением идентификаторов PID и меток даты, хотя работающая система создавала tlb и успешно регистрировалась, а нерабочая система регистрировала сборку, но не создавала tlb. - запустил Process Monitor и отфильтровал по CLSID для сборки при запуске приложения.У работающей системы было несколько записей в журнале, но у нерабочей системы их нет, что, как я полагаю, ожидается, так как tlb не был создан.
- посмотрел OleView на работающей системе, в которой была сборкаперечислены с библиотекой типов под ним.В нерабочей системе была указана сборка, но не было библиотеки ассоциированных типов.См. Ниже.
Ниже приведены различия между записями сборки в OleView в рабочих и нерабочих системах:
- В рабочей системе есть запись под сборкой, котораяЯ предполагаю, что соответствует библиотеке типов, которая была сгенерирована и зарегистрирована.Неработающая система не.
- _Object в нерабочей системе имеет дополнительное значение в CLSID, которое называется
InprocServer32[InprocServer32] = (gibberish here)
. - IConnectionPointContainer в нерабочей системе имеет ту же запись
InprocServer32
, что ивыше - то же самое для IDispatch, IManagedObject и IProvideClassInfo
Я просмотрю реестр, и, возможно, мне нужно удалить эти дополнительные записи и попытаться снова запустить regasm?
РЕДАКТИРОВАТЬ - Я решил проблему.Спасибо всем за вашу помощь.Оказывается, что файл отсутствовал в обеих системах, но по какой-то причине regasm работал на одной, а не на другой.Я подозреваю, что могло произойти изменение, когда зависимость была скопирована в папку, которая была в системном пути!Итак, я устроил "град Мэри", скопировал dll и выполнил регазм без каких-либо сообщений.И тогда приложение успешно загрузило плагин!