Невозможно скомпилировать приложение .NET с указанным TLB, когда библиотека не зарегистрирована - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть приложение C # 4.0, которое ссылается на библиотеку типов из приложения C ++.Это используется для некоторого безопасного COM-взаимодействия, вопрос, который я изначально задавал здесь .

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

Текст для Google:

не удалось найти имя типа или пространства имен (отсутствует директива using или ссылка на сборку?)

Невозможно получить путь к файлу для библиотеки типов "guid ...." версии 1.0.Библиотека не зарегистрирована.(Исключение из HRESULT: 0x8002801D (TYPE_E_LIBNOTRurable))

Не найден указанный компонент SecurityAgentLib

Изображение для удобства чтения: compilation error

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

В visual studio ссылка указывает на файл .tlb, который включен в решение.каталог, поэтому сам файл tlb присутствует.

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

РЕДАКТИРОВАТЬ: Запуск tlbimp.exe создает DLL, но библиотеки типов должно быть достаточно для компиляции, я думал, по крайней мере.Существует также проблема неработающих ссылок.Я читал эту статью Устранение неполадок, связанных с неработающими ссылками , и в нем говорится, что если ссылка была на компонент COM, который не установлен, то при установке компонента исправляется ошибка, которая является истинной.

Установка егона сервере сборки действительно не вариант.Открытие Visual Studio и повторное добавление ссылки, если путь был поврежден, тоже не работает.

Я смог использовать tlbimp для создания dll и использовал Visual Studio, добавив ссылку на эту dll.Это позволило мне скомпилировать, но как это будет работать на сервере автоматической сборки?

РЕДАКТИРОВАТЬ Хорошо, я предложил два решения, которые сработали, учитывая мое требование, чтобы все это оставалось без присмотра

  1. Запустил tlbimp, чтобы создать dll из библиотеки типов.Я удалил ссылку на tlb из моего проекта и добавил ссылку на саму dll.Когда исходный код был скопирован на новый компьютер, он скомпилировался без проблем.

В этом сценарии в идеале мы должны извлечь данные из SVN на сервере сборки и скопировать последнюю DLL из второго проекта, а затем скомпилироватьэтот проект.

Я также удалил tlb и добавил dll в visual studio и сделал diff для файла .csproj.Я не вижу никакого недостатка в том, чтобы просто иметь ссылку на dll вместо tlb, но при необходимости сервер сборки может внести изменения непосредственно в этот файл, чтобы удалить раздел tlb и добавить ссылку на dll после сборки второгопродукт.

1 Ответ

0 голосов
/ 15 декабря 2011

Вот пара вариантов, каждый из которых работал.

  • Запустите tlbimp, чтобы создать dll из библиотеки типов.Я удалил ссылку на tlb из моего проекта и добавил ссылку на саму dll.Когда исходный код был скопирован на новый компьютер, он компилировался без проблем.

В этом сценарии в идеале мы должны извлекать данные из SVN на сервере сборки и копировать последнюю DLL из второго проекта, а затем компилироватьэтот проект.

  • Я также удалил tlb, добавил dll и сделал diff для файла .csproj.Я не вижу никаких недостатков в том, чтобы просто иметь ссылку на dll вместо tlb, но сервер сборки может внести изменения непосредственно в этот файл, чтобы удалить tlb
...