фатальная ошибка C1084: невозможно прочитать файл библиотеки типов: 'Smegui.tlb': ошибка загрузки библиотеки типов / DLL - PullRequest
3 голосов
/ 16 июня 2010

Я пытаюсь создать старую версию приложения, которая состоит из проектов VC ++, написанных в Visual Studio 2003.

Моя ОС - Windows 7 Enterprise (64-разрядная). Когда я пытаюсь построить решение, я получаю следующие ошибки:

  • ошибка C4772: #import ссылается на тип из отсутствующей библиотеки типов; '__missing_type__' используется в качестве заполнителя
  • фатальная ошибка C1084: не удается прочитать файл библиотеки типов: 'Smegui.tlb': ошибка загрузки библиотеки типов / DLL.

Они оба жалуются на следующее утверждение импорта:

#import "Smegui.tlb" no_implementation

Это не тот случай, когда путь к файлу неверен, поскольку переименование файла Smegui.tlb приводит к тому, что компилятор выдает еще одну ошибку, говоря, что не может найти библиотеку.

Smegui из другого приложения, от которого зависит это. Я подумал, что, возможно, мне не хватает DLL, но нет такой вещи, как Smegui.dll.

Все, что я знаю о файлах .tlb, это то, что они являются библиотекой типов, и вы можете создавать их из сборки, используя tlbexp.exe или regasm.exe (последний также регистрирует сборку в COM)

Существует также скрипт сборки Apache Ant, который использует пользовательскую задачу для вызова devenv.com для сборки проектов. Это тот же сценарий, который изначально использовался сервером сборки для сборки приложения. Это выдает мне те же ошибки, когда я пытаюсь запустить его.

Самое странное в этом то, что я знал, что это должно работать, видя, как это все недавно проверено из подрывной деятельности. Я пробовал много разных комбинаций: администратор против повышения пользователя, VS против сборки Ant, очистки, выпуска.

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

Если кто-то может пролить свет на то, как этот tlb-материал вообще работает или что эта ошибка может означать, я был бы очень признателен.

Ответы [ 4 ]

4 голосов
/ 06 октября 2011

Я нашел гораздо более надежное решение: откройте tlb с помощью oleview.exe, а затем закройте его.

Не уверен, что это на самом деле делает, но работает каждый раз.

Я думаю, что oleview на самом деле является одним из примеров, включенных в Visual Studio, но у меня не было времени отладить его и посмотреть, что он делает.

4 голосов
/ 16 июня 2010

http://msdn.microsoft.com/en-us/library/sce74ah7%28VS.71%29.aspx

smegui.tlb ссылается на другой tlb, который не может найти компилятор.Если у вас есть .idl для smegui, вы можете выяснить, что такое другой.Я подозреваю, что отсутствующий tlb - это то, что было зарегистрировано в исходной сборочной машине, но ваша машина не зарегистрировалась.

Библиотека типов - это двоичное описание набора интерфейсов, классов и перечислений.Они обычно генерируются для компонентов COM, в случае tlbexp и regasm tlb создается из метаданных сборки.Для собственных COM-компонентов они обычно генерируются из файла idl (Язык описания интерфейса) с помощью инструмента midl.

Редактировать:

Я только что заметил, что вы находитесь на Windows x64.Вы строите проект с новой версией Visual Studio?Если да, то вы ориентируетесь на x86 или x64?Если последнее, то это может быть просто 32-битный компонент, который компилятор не может найти (или менее вероятно, компонент x64, который компилятор x86 не может найти, если вы ориентируетесь на x86), для WOW64 реестр виртуализирован для x86 иx64 приложения.

3 голосов
/ 08 августа 2018

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

Чтобы найти библиотеку псевдо-пропущенных типов, я запустил Process Monitor (procman64.exe) во время компиляции. Это показало, что после успешной загрузки указанной библиотеки типов не удалось найти зависимую библиотеку типов. Он даже показал все места, где он искал зависимую библиотеку типов, ни в одном из которых он не находился там, где должен был искать (например: procman output).

Исправление было в том, чтобы добавить <PreBuildEvent> в проект, чтобы скопировать зависимый файл .tlb в один из каталогов, которые в действительности находились в поиске.

<PreBuildEvent>
  <Command>copy /Y ..\Lib\Interop\CWSpeechRecLib.tlb .\</Command>
</PreBuildEvent>
0 голосов
/ 18 июня 2010

Ну, я наконец-то узнал, почему мне удавалось заставить его собирать иногда, а не другие ... вроде.

Пока я запускал скрипт сборки с повышенными правами администратора и позволил этому пройти как можно дальшедо тех пор, пока не возникнет эта ошибка, затем снова запустите сценарий сборки, как только защищенный администратор преуспел.Эти шаги должны быть выполнены в точном порядке, без каких-либо других промежуточных шагов.Если я пытаюсь собрать в Visual Studio, он не работает (хотя я однажды добился успеха).Вероятно, это какая-то проблема виртуализации, хотя она все еще не совсем имеет смысла.

Что ж, мне больше не нужна помощь в этом, и я знаю, что, вероятно, невозможно полностью ответить на этот вопрос, не зная точно, что такое сборка.делается.Однако, если у кого-то есть еще мысли, я с радостью их получу.

Приветствия,

Стейни

...