Ссылки на сборку не будут корректно разрешены на нашем сервере сборки.

Мы используем код С# с использованием VS2008 SP1. У нас есть сервер, на котором работает Team System Server 2008, который мы используем для управления версиями, задач и т.д. сервер также является нашей машиной для сборки Team Build. Это работает очень хорошо в течение длительного времени. До сих пор. Мы получаем эти сообщения об ошибках при попытке создать один из наших проектов с ссылкой на одну внешнюю сборку (это происходит как с помощью Team Build, и при входе в систему физически и регулярной сборки через Visual Studio):

C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets: предупреждение MSB3246: разрешенный файл имеет плохое изображение, отсутствие метаданных или в противном случае недоступно. Не мог загрузить файл или сборка 'C:\Program Файлы \Syncfusion\Essential Студия\7.1.0.21\Сборки\3.5\Syncfusion.XlsIO.Base.dll "или одной из его зависимостей. Модуль как ожидается, будет содержать сборку манифест.

C:\Program Файлы \MSBuild\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets(24,2): ошибка MSB4062: Задача" Microsoft.Reporting.RdlCompile "не может быть загружен из сборки Microsoft.ReportViewer.Common, Версия = 9.0.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a. Мог не загружать файл или сборку" Microsoft.ReportViewer.Common, Версия = 9.0.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a 'или одной из его зависимостей. Модуль как ожидается, будет содержать сборку манифест. Подтвердите, что правильность декларации и что сборка и все ее зависимости доступны.

Указанный компонент "Syncfusion.XlsIO.Base" не может быть найдено.

Эти ошибки относятся к одному проекту с одной проблематичной ссылкой на сборку. Когда я пытаюсь построить все решение, из-за этого, конечно, есть много ошибок. И есть еще два проекта, которые имеют ту же проблему с другими ссылками на сборку. У меня есть список ссылочных сборок, которые VS не может решить:

  • Microsoft.ReportViewer.Common
  • Microsoft.ReportViewer.WinForms
  • Syncfusion.Compression.Base
  • Syncfusion.Core
  • Syncfusion.XlsIO.Base

Собрания Syncfusion относятся к стороннему пакету компонентов. Остальные два относятся к компоненту Microsoft ReportViewer.

Ссылки добавлены через окно "Добавить ссылку" на вкладке .NET, поэтому я не думаю, что в этом есть что-то подозрительное. В окне свойств ссылки на сборку нет значения в "Культуре", "Описание", "Путь", "Время выполнения" или "Сильное имя". Версия говорит 0.0.0.0, а Resolved - False. Я думаю, это довольно очевидно, что VS can not разрешает ссылку. Мой вопрос: почему??? Я поцарапал себе голову над этим. Это происходит только на сервере, решение просто отлично работает как на моей машине, так и на моей машине. Ссылочные свойства сборки отлично подходят для наших машин.

Я попробовал удалить сторонний компонент (на сервере, конечно), а затем снова переустановил его. Не помогло. Я попытался восстановить установку VS2008. Не помогло. Попытался получить более раннюю версию из источника управления (который, как мне известно, уже был на сервере), и я получил те же сообщения об ошибках. Я проверил права доступа к файлам, и все, кажется, в порядке. У меня заканчиваются идеи...

Как это решить?

Обновление 16.02.2009:
Я попытался сравнить вывод ildasm из dll на моем компьютере и на сервере (см. Комментарий, который я написал об этом), и есть одна небольшая разница в строке, которая мне кажется комментарий. Должен признаться, что я не понимаю, почему существует разница, так что, может быть, кто-то может объяснить это мне? Я также попробовал запустить проверку на вирусы на сервере. Не помогло. Попробовал удалить ссылку , а затем readd, просмотрев DLL на диске. Не работает.

Обновление 17.03.2009:
Я нашел решение! Преступником был модуль TruPrevent Panda Антивирус, После отключения модуля все работает! =)
Я обнаружил это с помощью fuslogvw.exe и созданного журнала. Поделился результатами и наткнулся на эту запись в блоге.. Надеюсь, это поможет кому-то другому.

Ответы

Ответ 1

Почти наверняка проблема связана с окружающей средой, а не с источником.

Некоторые идеи...

(i) Попробуйте отключить средства защиты от вирусов и вредоносных программ. Я видел случаи, когда эти инструменты (в частности, Trend Micro Antivirus, по какой-то причине) могут сохранять файл DLL заблокированным после (во время?) сканирования, вмешиваться с компиляторами.

(ii) Проверьте переменную среды PATH. Даже в эти современные времена переменная PATH используется для решения некоторых задач - если это испорчено (слишком длинная, максимальная длина - 2048 символов IIRC), тогда все может быть нечетным.

(iii) Вы проверили разрешения файлов - вы проверяли разрешения в реестре? Например, SyncFusion устанавливает свой лицензионный ключ как в ульях пользователя, так и в машине - если сервер сборки не может читать один или другой, могут возникнуть проблемы.

Удачи!

Ответ 2

Также может быть, что ссылочные сборки находятся в GAC на машине dev, но не на машине сборки. Вытащите его из GAC в исходный репозиторий и укажите его по пути.

Ответ 3

У нас была такая же проблема, оказалось, что накопитель C был заполнен (всего 28 МБ).
Освобождение пространства разрешило проблему, хотя сборка происходит на D.

Ответ 4

Вы видите различия между ildasm этого файла

'C:\Program Files\Syncfusion\Essential Studio\7.1.0.21\Assemblies\3.5\Syncfusion.XlsIO.Base.dll'

на вашем компьютере или на сервере?

Ответ 5

Мое подозрение заключается в том, что пользователь, которому работает процесс сборки, не имеет доступа к папке, в которой находится ваш сторонний элемент управления. Поскольку это правильно функционирует на ваших компьютерах, это почти наверняка зависит от пользователя и разрешения.

Ответ 6

Ваша сторонняя dll может зависеть от неуправляемых DLL. Часто это происходит из-за отсутствия конкретной версии VС++ Runtime Dll.

Откройте Dll с помощью Walker Dependency http://www.dependencywalker.com/ на вашем сервере и проверьте отсутствие ссылок.

Ответ 7

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