У меня есть приложение C # 4.0, которое ссылается на библиотеку типов из приложения C ++.Это используется для некоторого безопасного COM-взаимодействия, вопрос, который я изначально задавал здесь .
На моей машине для разработки установлено второе приложение, поэтому я могу скомпилировать его без проблем.Если я пытаюсь скомпилировать на нашем автоматизированном сервере сборки или на любом компьютере с установленной Visual Studio, но без этой второй программы, я получаю следующие ошибки и происходит сбой компиляции:
Текст для Google:
не удалось найти имя типа или пространства имен (отсутствует директива using или ссылка на сборку?)
Невозможно получить путь к файлу для библиотеки типов "guid ...." версии 1.0.Библиотека не зарегистрирована.(Исключение из HRESULT: 0x8002801D (TYPE_E_LIBNOTRurable))
Не найден указанный компонент SecurityAgentLib
Изображение для удобства чтения:
Я не уверенкак обойти это иначе, чем путем установки приложения, которое регистрирует фактическую DLL, которая реализует эти типы, но я не хочу делать это на нашем сервере сборки.Код, который использует эти типы, обернут в класс, который никогда не создается, если не выполняются предварительные проверки, чтобы убедиться, что приложение действительно установлено, поэтому нет вероятности ошибки во время выполнения.На самом деле я могу нормально запускать свое приложение на компьютере без установленного второго приложения - я просто не могу скомпилировать его там.
В visual studio ссылка указывает на файл .tlb, который включен в решение.каталог, поэтому сам файл tlb присутствует.
Я не могу себе представить, что это должно работать таким образом, и я искал вокруг, но, очевидно, я не ищу правильные термины.
РЕДАКТИРОВАТЬ: Запуск tlbimp.exe создает DLL, но библиотеки типов должно быть достаточно для компиляции, я думал, по крайней мере.Существует также проблема неработающих ссылок.Я читал эту статью Устранение неполадок, связанных с неработающими ссылками , и в нем говорится, что если ссылка была на компонент COM, который не установлен, то при установке компонента исправляется ошибка, которая является истинной.
Установка егона сервере сборки действительно не вариант.Открытие Visual Studio и повторное добавление ссылки, если путь был поврежден, тоже не работает.
Я смог использовать tlbimp для создания dll и использовал Visual Studio, добавив ссылку на эту dll.Это позволило мне скомпилировать, но как это будет работать на сервере автоматической сборки?
РЕДАКТИРОВАТЬ Хорошо, я предложил два решения, которые сработали, учитывая мое требование, чтобы все это оставалось без присмотра
- Запустил tlbimp, чтобы создать dll из библиотеки типов.Я удалил ссылку на tlb из моего проекта и добавил ссылку на саму dll.Когда исходный код был скопирован на новый компьютер, он скомпилировался без проблем.
В этом сценарии в идеале мы должны извлечь данные из SVN на сервере сборки и скопировать последнюю DLL из второго проекта, а затем скомпилироватьэтот проект.
Я также удалил tlb и добавил dll в visual studio и сделал diff для файла .csproj.Я не вижу никакого недостатка в том, чтобы просто иметь ссылку на dll вместо tlb, но при необходимости сервер сборки может внести изменения непосредственно в этот файл, чтобы удалить раздел tlb и добавить ссылку на dll после сборки второгопродукт.