Обновление: Вчера вечером я решил, что это - просто слишком много работы для изменения папки, где некоторые отчеты сохраняются. Мое обходное решение здесь должно переименовать папку, выполнить пакетное задание, в котором я нуждаюсь сделанный и затем возвращаю имя папки к тому, чем это было первоначально. Я чувствую, что мог потратить остальную часть сегодня и всю следующую неделю, работая над этим и все еще не иметь ничего для показа. Я поймал бы ад для того, чтобы быть против моего босса, чем не смог бы выставить счет нашим клиентам (который только происходит один раз в год). Спасибо всем те, кто помог, я унижен Вашей готовностью помочь некоторому анонимному парню в по его голове. Я не уверен, как "отказаться" от этого вопроса, но все еще дать Вам опоры парней, я считаю часто задаваемые вопросы и любые комментарии во время ланча.Спасибо.
Я пытаюсь отладить c# приложение, которое создал мой предшественник. он - программист, я - системный администратор, возможно, это - то, где я иду не так, как надо.
Так или иначе я должен перекомпилировать один из блоков и развернуть его на нашем рабочем сервере. Когда я компилирую его, я получаю ошибку:
Тип 'Mcrcsip. Сеть. McrcsipWebExceptionBase является definined в блоке, на который не ссылаются. Необходимо добавить ссылку на блок 'Mcrcsip. Сеть, Version=2.0.3266.28977, Culture=neutral, PublicKeyToken=c3de6c6abcdf794b'.
У меня, оказывается, есть копия того блока, и когда я удаляю ссылку на существующий блок (2.0.0.0 с другим маркером открытых ключей) и добавляю ссылку на блок, это просит, когда я компилирую, я получаю это сообщение об ошибке:
Тип 'Mcrcsip. Сеть. McrcsipWebExceptionBase является definined в блоке, на который не ссылаются. Необходимо добавить ссылку на блок 'Mcrcsip. Сеть, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8bbdde85caf008d0'.
Если я ищу эту ошибку на Google (genericised, конечно) я добираюсь, набор "этого - то, как Вы добавляете ссылку на сборку..." результаты.
Как я выхожу из этой карусели?
Вот то, как решение разметило:
http://amwa-test.internal.lan/
Несоответствия в ссылках или: как я научился перестать беспокоиться и полюбить ILDASM
кхм, кашель, кашель,
Проблема
Ник,
Перечитав ваш исходный пост, становится ясно, что вы есть проблема несогласованности версии dll. То есть по крайней мере один проект в вашем решении зависит от Mcrcsip.Web версии X, и по крайней мере один проект в вашем решении зависит от Mcrcsip.Web версии Y [или, что еще хуже, зависит от библиотеки, которая зависит от Mcrcsip.Web версии Y ]. Их может быть сложно и утомительно отследить.
См. Рекомендуемое решение , чтобы перейти к концу.
Как
Такое несоответствие возникает, когда
вопреки тому, что мы интуитивно ожидаем, B не будет автоматически обновляться для использования C версии 2 при построении A. И A, и B должны ссылаться та же библиотека для правильной сборки. Таким образом, либо A должен соответствовать C вер. 1, либо B должен быть перестроен и соответствовать C вер. 2.
Теперь это может произойти в любой конфигурации проекта, поэтому важно обновлять версию вашего программного обеспечения [поверьте мне, эта проблема становится хуже без надлежащей подписи \ управления версиями], и хорошо общаться внутри вашей команды всякий раз, когда происходит обновление зависимостей.
Также стоит знать, что существует два типа ссылок на зависимости, жесткие и мягкие [на самом деле, это одно и то же, то есть ссылки на библиотеки DLL, за исключением того, что один является частным случаем другого и концептуально помогает различать два].
Жесткие ссылки
Жесткие ссылки - это зависимость проекта от статической библиотеки DLL. То есть зависимость была создана в определенное время и никогда не будет обновляться, если ее физический файл не будет заменен новым. Жесткие ссылки добавляются к решению через диалоговое окно «Добавить ссылки» и добавляются ссылки из вкладок .Net, COM или «Обзор». Жесткие ссылки обычно используются для добавления зависимостей к программному обеспечению, разработанному за пределами области действия текущего решения [например, фреймворк, сторонние и другие сторонние продукты, разработанные другими внутренними группами]. Жесткие ссылки также имеют тенденцию становиться устаревшими, поскольку они поддерживаются и обновляются в собственном потоке разработки.
Предположим, что в сценарии выше
Далее предположим, что A и B находятся в одном решении
При создании A вы получите сообщение об ошибке описано. A ожидает объект от C v2, но поскольку B имеет жесткую зависимость от C v1, C v1 сначала загружается в память, и возникает коллизия. Ожидает v2 и находит v1. Это твоя ошибка.
Чтобы разрешить эту ситуацию, вы должны
Мягкие ссылки
Мягкая ссылка - это зависимость проекта от другого проекта в рамках того же решения. То есть зависимость перестраивается каждый раз, когда перестраивается все решение. Мягкие ссылки добавляются в решение через диалоговое окно «Добавить ссылки» и добавляются ссылки на вкладке «Проекты». Мягкие ссылки обычно используются для добавления зависимостей к программному обеспечению, разработанному в рамках текущего решения, они имеют основное преимущество распространения изменений по мере их внесения потребителям в рамках того же решения. В силу этого факта мягкие ссылки не могут быть устаревшими.
[это особый случай жесткой ссылки, Visual Studio добавит ссылку, указывающую на выходной путь целевого проекта, я считаю, что она также обновляет это path, если целевой проект изменяет свою конфигурацию вывода - но очень удобная функция, которая требует различий]
Предположим, что в сценарии выше
Кроме того, предположим, что A и B находятся в одном решении
Когда A будет собран, вы получите описанную вами ошибку.A ожидает объект от C v2, но поскольку B имеет жесткую зависимость от C v1, C v1 сначала загружается в память, и возникает коллизия. A ожидает v2 и находит v1. Это твоя ошибка.
Чтобы решить эту проблему,
Как видите, мягкие ссылки легче поддерживать.
IL DASM [Intermediate Language DisASeMbler]
Теперь, когда вы знаете немного больше о ссылках и сопровождении проекта, как именно вы можете определить состояние вашей сборки? После всего, любой из ваших проектов или их зависимостей может быть несовместимым.
Самый простой способ - открыть выходной каталог сборки и проверить манифест сборки каждой библиотеки DLL, созданной вашим решением.
Чтобы проверить манифест сборки,
ildasm.exe
] ildasm
окно Это утомительно и болезненно, но если вы столкнетесь с [нетривиальной] ошибкой несогласованности dll, это единственный способ ее найти.
Рекомендуемое решение
Если на этом этапе по-прежнему возникают ошибки, то вы знаете, что один или все из
использует вашу зависимость от Mcrcsip.Web и ссылается на старую версию. В этом случае для каждой жесткой ссылки, перечисленной выше
ildasm
Убедитесь, что вы сделали это для каждой из трех жестких ссылок выше. как только вы определите, какое из этих трех подмножеств ссылается на старую версию Mcrcsip.Web, теперь вы можете найти этот проект, обновить его жесткую ссылку, перестроить его и, наконец, обновить свой жесткая ссылка, перестройка и вуаля. Боб твой дядя.
Уф.
Le fin
PS извиняюсь за многословие. это не очень сложная проблема, но, как я уверен, вы согласитесь, она включает в себя множество деталей. я очень надеюсь, что это поможет. спасибо и за ваше сотрудничество :)
PPS, кстати, из ваших комментариев я делаю вывод, что оригинальный разработчик везде использовал жесткие ссылки [т.е. даже в одном решении]. возможно, у него были свои причины, но имо, это задница.
Следите за сборкой других в параметрах пакетной сборки. Это позволит вам определить приоритетность сборки, которую нужно построить в первую очередь, после чего зависимости получат свои DLL по мере необходимости в правильном порядке.
Если щелкнуть ссылку правой кнопкой мыши и перейти к свойствам, какое значение "Определенная версия" установлено? Убедитесь, что для него установлено значение «True» и указана действительно версия 2.0.x.
На странице свойств еще раз проверьте путь. У вас может быть другая версия, зарегистрированная в другом месте вашего GAC, которая имеет приоритет. Используйте "gacutil -l" в командной строке, чтобы получить список всех зарегистрированных версий этой сборки. Если вы видите дубликаты с разными ключами, используйте gacutil, чтобы уничтожить тот, который вам не нужен.