В проекте развертывания отсутствует зависимость проекта

У меня есть проект развертывания VS2008, в котором создается установщик для пары служб Windows.

Каждая служба ссылается на несколько разных проектов:

CustomerName.MailSendingService
 -> CustomerName.Network
 -> CustomerName.Data
 -> CustomerName.Security

CustomerName.ProductIntegrationService
 -> CustomerName.Core
 -> CustomerName.Security

Проекты служб Windows, проекты, на которые они ссылаются, и проект развертывания - все в одном решении VS2008.

Я добавил основной вывод из проектов службы Windows в редактор файловой системы проекта развертывания.

Я ожидаю, что основной результат для проектов служб Windows будет включать библиотеки DLL из проектов, на которые имеются ссылки. Однако при создании проекта развертывания библиотека DLL одного из проектов, на которые имеется ссылка, отсутствует. (CustomerName.ProductIntegrationService отсутствует CustomerName.Security)

К сожалению, присутствуют библиотеки DLL для других проектов, на которые ссылается служба Windows; отсутствует результат только одного проекта.

(Edit) Я проверил, что для ссылки установлено значение «Копировать локально» в окне свойств ссылки. DLL для указанного проекта помещается в папку bin\Release проекта службы Windows, но не упакована в файл MSI, созданный для проекта развертывания.

(Изменить 2) Следуя предложению Джозефа Дейгла, я проверил, что зависимость находится в списке зависимостей для основного вывода и не помечена как «исключена», так что, похоже, это не является причиной этой проблемы.

Почему не хватало результатов только одного проекта?


person Joseph Anderson    schedule 25.09.2008    source источник
comment
Для меня это все еще проблема VS2010   -  person Grhm    schedule 05.03.2012


Ответы (8)


Мне нужно добавить еще пару вещей после воспроизведения того же подозреваемого дефекта msi.

1) Когда я добавил второй вывод проекта, использующий ту же обнаруженную зависимость от установщика, он не добавлял зависимость автоматически. Я удалил оба вывода проекта и добавил их обратно в обратном порядке. Второй добавленный вывод проекта никогда не добавлял обнаруженную зависимость. Это исключает любые проблемы с конфигурацией или кодом для проектов и того, как были добавлены ссылки. Всегда терпит неудачу второй.

2) Моя команда фактически столкнулась со второй проблемой после использования обходного пути «Добавить обнаруженную сборку вручную». Первоначально мы добавили зависимость из местоположения в '\ Program Files \ xxx', но столкнулись с проблемами сборки на 64-битных машинах, где такая же зависимость находилась в папке '\ Program Files (x86) \ xxx', хотя VS достаточно умен, чтобы справиться с этой проблемой при подборе референсов.

  • Правильный способ добавить сборку вручную - перейти в папку bin и добавить сборку, которая копируется локально. Это гарантирует, что нужная сборка будет присутствовать на машинах x86 или x64.
person Chad Pavliska    schedule 06.07.2010

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

Ручное добавление первичного вывода для отсутствующей библиотеки dll кажется жизнеспособным решением.

person Sam    schedule 09.03.2009

Я еще не использовал Visual Studio 2008, однако в 2005 году вы должны убедиться, что для отсутствующей ссылки в проекте для свойства Copy Local установлено значение true.

Это скопирует отсутствующий файл в выходной каталог.

person hectorsq    schedule 25.09.2008

В дополнение к ответу hectorsq убедитесь, что зависимость находится в списке зависимостей проекта развертывания и что соответствующая DLL помечена для включения.

person Joseph Daigle    schedule 25.09.2008
comment
Не могли бы вы пояснить, что вы имеете в виду под пометкой для включения? Я проверил, что зависимость находится в списке зависимостей для основного вывода и не помечена как исключенная. - person Joseph Anderson; 25.09.2008
comment
Извините, я имел в виду именно это, что он не помечен как исключенный. К сожалению, кажется, что он должен быть включен, поэтому я в тупике. - person Joseph Daigle; 25.09.2008

Вы пробовали смотреть на свою dll в отражателе, чтобы узнать, действительно ли она зависит от другой dll? VS достаточно умен, чтобы не включать сборку, на которую указывает ссылка, если видит, что вы на самом деле ее не используете.

К тому же, даже если вы «думаете», что используете его, VS может оптимизировать ваше использование - это предельный случай, но я это видел:

Например, если у вас есть сборка констант с этим в:

public const string LockPanelUrn = "ApplicationRack.LockPanel";

VS вставит строку прямо в ссылочный код.

Кроме того, я предлагаю удалить и перестроить ваше решение для установки.

person Benjol    schedule 30.09.2008

Вы добавляли эту зависимость сборки после первоначального создания проекта развертывания? В этом случае вам может потребоваться щелкнуть правой кнопкой мыши папку «Обнаруженные зависимости» и выбрать «Обновить зависимости». Он подберет все новое, что было добавлено с тех пор, как вы это делали в последний раз.

person Community    schedule 21.11.2008
comment
Я сделал это, но, по сути, на первичном выходе ... в представлении файловой системы свойство Outputs не перечисляет DLL, на которые ссылаются, что заставляет меня думать, что это не работает так. - person Marcel; 20.05.2011

проверьте это - возможно, это не объясняет, почему это так, но, по крайней мере, это дает какое-то обходное решение :)

http://lo-sharpdevs.blogspot.com/2009/07/vs-2008-disappearing-dependencies.html

person Community    schedule 03.07.2009

У меня была аналогичная проблема с использованием объектов Microsoft SMO. У меня есть двоичный компонент (X.dll), который использует эти объекты Microsoft SMO, которые я сделал сам. После компиляции X.dll я ссылаюсь на него в другом проекте EXE, используя X.dll (а не код). Присоединенный к нему проект установщика определяет, что ему нужны объекты Microsoft SMO, и обнаруживает, что они являются локальными для моей установки SQL Server на машине.

Компонент X.dll, который использует объекты SMO, ссылается на объекты Microsoft SMO через локальную папку «Externals», которую я храню на общем диске. Все модули скомпилированы со ссылкой на них, однако мой проект установки с моим проектом EXE обнаруживает модули из моей установки SQL Server.

Из-за этого у нас есть другой компьютер, на котором есть папка «Внешние» с объектами SMO, но проект установки больше не будет находить объекты SMO из «Обнаруженных зависимостей», так как он не понимает, что объекты SMO находятся во внешнем модуле! Я не уверен, где он ищет файлы обнаруженных зависимостей, но он не смотрит на то, откуда X.dll их изначально взял, или даже на папку EXE, возможно ...

person Max Power    schedule 02.02.2011