Ссылки на сборку - PullRequest
       24

Ссылки на сборку

8 голосов
/ 04 марта 2010

Обновление: вчера вечером я решил, что это слишком много работы, чтобы изменить папку, в которой сохраняются некоторые отчеты. Мой обходной путь заключается в том, чтобы переименовать папку, запустить пакетное задание, которое мне нужно сделать, а затем изменить имя папки на прежнее. Я чувствую, что могу провести остаток сегодняшнего дня и всю следующую неделю, работая над этим, и мне все еще нечего показать Я предпочел бы поймать себя за то, что пошел против моего босса, чем не иметь возможности выставлять счета нашим клиентам (что случается только один раз в год). Спасибо всем, кто помог, я смирился с вашей готовностью помочь какому-то анонимному парню над его головой. Я не уверен, как «отказаться» от этого вопроса, но все же дам вам ребята реквизит, я буду читать часто задаваемые вопросы и любые комментарии во время обеда. Спасибо.

Я пытаюсь отладить приложение на c #, созданное моим предшественником. он программист, я системный администратор, может быть, я ошибаюсь.

В любом случае мне нужно перекомпилировать одну из сборок и развернуть ее на нашем производственном сервере. Когда я его компилирую, я получаю сообщение об ошибке:

Тип 'Mcrcsip.Web.McrcsipWebExceptionBase определяется в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку 'Mcrcsip.Web, версия = 2.0.3266.28977, культура = нейтральная, PublicKeyToken = c3de6c6abcdf794b'.

У меня, случается, есть копия этой сборки, и когда я удаляю ссылку на существующую сборку (2.0.0.0 с другим токеном открытого ключа) и добавляю ссылку на сборку, которую она запрашивает, при компиляции я получить это сообщение об ошибке:

тип «Mcrcsip.Web.McrcsipWebExceptionBase определяется в сборке, которая не упоминается. Вы должны добавить ссылка на сборку 'Mcrcsip.Web, Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = 8bbdde85caf008d0' .

Если я ищу эту ошибку в Google (конечно, обобщенно), я получаю кучу результатов «вот как вы добавляете ссылку на сборку ...».

Как мне выйти из этой карусели?

Вот как выложено решение:

  • Mcrcsip.Amwa.Solution
    • http://amwa-test.internal.lan/
    • Mcrcsip.Amwa.Core
      • Mcrcsip.Aws.Bol
      • Mcrcsip.Common
      • Mcrcsip.Web
      • nunit.framework
      • System
      • System.Configuration
      • System.Data
      • Услуги System.Enterprise
      • System.Web
      • System.Web.Services
      • System.XML
    • Mcrcsip.Amwa.CrFactory
      • CrystalDecisions.CrystalReports.Engine
      • CrystalDecisions.Enterprise.Framework
      • CrystalDecisions.Enterprise.InfoStore
      • CrystalDecisions.ReportSource
      • CrystalDecisions.Shared
      • CrystalDecisions.Web
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Web
      • System
      • System.Configuration
      • System.Data
      • System.Drawing
      • System.Web
      • System.XML
    • Mcrcsip.Amwa.PdfFormHandler
      • itextsharp
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Web
      • System
      • System.Configuration
      • System.Data
      • System.Web
      • System.Xml
    • Mcrcsip.Amwa.Web
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Amwa.CrFactory
      • Mcrcsip.Amwa.PdfFormHandler
      • Mcrcsip.Aws.BOL
      • Mcrcsip.Common
      • Mcrcsip.SharePoint
      • Mcrcsip.Web
      • System
      • System.Configuration
      • System.Data
      • System.EnterpriseServices
      • System.Web
      • System.Web.Services
      • System.XML
    • Mcrcsip.Amwa.WebControls
      • System
      • System.Data
      • System.Design
      • System.Drawing
      • System.Web
      • System.Xml
    • Mcrcsip.Amwa.Setup

Ответы [ 3 ]

7 голосов
/ 04 марта 2010

Ссылочные несоответствия или: как я научился перестать беспокоиться и любить ILDASM

Гм, кашель,

Задача

Ник

Из перечитывания вашего исходного поста становится ясно, что у вас есть проблема с несогласованностью версий dll. То есть, по крайней мере, один проект в вашем решении зависит от Mcrcsip.Web версии X, и, по крайней мере, один проект в вашем решении зависит от Mcrcsip.Web версии Y [или, что еще хуже, зависит от библиотеки, которая зависит от Mcrcsip.Web версии Y ]. Отследить их может быть сложно и утомительно.

См. Рекомендуемое решение , чтобы пропустить до конца.

Как

Такое несоответствие возникает, когда

  1. у вас есть зависимость, такая как A зависит от B и C, B зависит от C,
  2. A и B изначально построены против C ver 1,
  3. A обновлено и построено для C ver 2,

вопреки тому, что мы интуитивно ожидаем, B не будет автоматически обновляться для использования C ver 2 при построении A. И A, и B должны ссылаться на одну и ту же библиотеку для построения должным образом. Таким образом, либо A должно соответствовать C ver 1, либо B должно быть перестроено и соответствовать C ver 2.

Теперь, это может произойти в любой конфигурации проекта, поэтому важно сделать версию вашего программного обеспечения [поверьте мне, эта проблема усугубляется без надлежащего подписывания \ контроля версий] и хорошо общаться в вашей команде всякий раз, когда происходит обновление зависимостей.

Стоит также знать, что есть два вида ссылок на зависимости, жесткие и мягкие [на самом деле они одинаковы, то есть ссылки на dll, за исключением того, что один является частным случаем другого, и концептуально он помогает различать два].

Жесткие ссылки

Жесткая ссылка - это зависимость проекта от статической DLL. То есть зависимость была построена в определенное время и никогда не будет обновляться, если ее физический файл не будет заменен новым. Жесткие ссылки добавляются в решение с помощью диалогового окна «Добавить ссылки» и добавления ссылки на вкладках .Net, COM или «Обзор». Жесткие ссылки, как правило, используются для добавления зависимостей к программному обеспечению, разработанному за рамками текущего решения [то есть, фреймворк, сторонние продукты и другие сторонние продукты, разработанные другими внутренними группами]. Жесткие ссылки также имеют тенденцию становиться устаревшими, потому что они поддерживаются и обновляются их собственным потоком разработки.

Предположим, сценарий выше

  1. у вас есть зависимость, такая как A зависит от B и C, B зависит от C,
  2. A и B изначально построены против C ver 1,
  3. A обновлено и построено для C ver 2,

Далее, предположим, что A и B находятся в одном решении

  • SimpleSolution
    • A
      • B [Жесткая ссылка]
      • C v2 [Жесткая ссылка]
    • B
      • C v1 [Жесткая ссылка]

Когда A построено, вы получите ошибку, которую вы описали. A ожидает объект от C v2, но, поскольку B жестко зависит от C v1, C v1 сначала загружается в память, и возникает коллизия. A ожидает v2 и находит v1. Это ваша ошибка.

Чтобы разрешить эту ситуацию, вы должны

  1. Обновить жесткую ссылку на проект B C v1 до C v2
  2. Принудительное перестроение проекта B
  3. Обновление проекта A жесткая ссылка B на [недавно построенный] B
  4. Принудительное восстановление A

Мягкие ссылки

Мягкая ссылка - это зависимость проекта от другого проекта в том же решении. То есть зависимость перестраивается каждый раз, когда перестраивается все решение. Мягкие ссылки добавляются в решение с помощью диалога Добавить ссылки и добавления ссылки на вкладке Проекты. Мягкие ссылки обычно используются для добавления зависимостей к программному обеспечению, разработанному в рамках текущего решения, они имеют основное преимущество в распространении изменений , поскольку они вносятся для потребителей в рамках одного решения. В силу этого факта, мягкие ссылки не могут быть устаревшими.

[это особый случай жесткой ссылки, Visual Studio добавит ссылку, указывающую на выходной путь целевого проекта, я считаю, что он также обновляет этот путь, если целевой проект меняет свою выходную конфигурацию - но очень удобная функция, которая требует различия]

Предположим, сценарий выше

  1. у вас есть зависимость, такая как A зависит от B и C, B зависит от C,
  2. A и B изначально построены против C ver 1,
  3. A обновлен и построен на C ver 2,

Далее, предположим, что A и B находятся в одном решении

  • SimpleSolution
    • A
      • B [Мягкая ссылка]
      • C v2 [Жесткая ссылка]
    • B
      • C v1 [Жесткая ссылка]

Когда будет построен A, вы получите ошибку, которую вы описали. A ожидает объект от C v2, но, поскольку B жестко зависит от C v1, C v1 сначала загружается в память, и возникает коллизия. A ожидает v2 и находит v1. Это твоя ошибка.

Для разрешения

  1. Обновить жесткую ссылку на проект B C v1 до C v2
  2. Принудительное восстановление A

Как вы видите, мягкие ссылки легче поддерживать.

IL DASM [Промежуточный язык DisASeMbler]

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

Самый простой способ - открыть выходной каталог вашей сборки и проверить манифест сборки каждого dll, созданного вашим решением.

Чтобы проверить манифест сборки,

  1. открыто ildasm.exe
    • Для VS2010 ildasm доступен с ярлыка
    • Для VS2008 и VS2005 откройте командную строку Visual Studio, введите в командной строке «ildasm»
  2. открыть dll,
    • нажмите Файл -> Открыть или
    • нажмите Ctrl-O или
    • перетащите свою DLL в ildasm окно
  3. открыть манифест
    • дважды щелкните узел красного треугольника с надписью MANIFEST
  4. найти ссылки на Mcrcsip.Web
    • нажмите Найти и введите Mcrcsip.Web в диалоговое окно, или
    • нажмите Alt-F и введите Mcrcsip.Web в диалоговое окно, или
    • проверить содержимое файла MANIFEST вручную
  5. проверить номер версии

Это утомительно и больно, но если вы столкнулись с [нетривиальной] ошибкой несогласованности dll, это единственный способ ее найти

Рекомендуемое решение

  1. Убедитесь, что ваше решение использует мягкие ссылки, где это применимо,
    • развернуть Mcrcsip.Amwa.CrFactory
      • развернуть Список литературы
      • удалить ссылку Mcrcsip.Amwa.Core
      • открыть диалоговое окно добавления ссылок
      • открыть Mcrcsip.Amwa.Core на вкладке "Проекты"
    • развернуть Mcrcsip.Amwa.PdfFormHandler
      • развернуть Список литературы
      • удалить ссылку Mcrcsip.Amwa.Core
      • открыть диалог добавления ссылок
      • открыть Mcrcsip.Amwa.Core на вкладке "Проекты"
    • развернуть Mcrcsip.Amwa.Web
      • развернуть Список литературы
      • удалить ссылку Mcrcsip.Amwa.Core
      • удалить ссылку Mcrcsip.Amwa.CrFactory
      • удалить ссылку Mcrcsip.Amwa.PdfFormHandler
      • открыть диалог добавления ссылок
      • открыть Mcrcsip.Amwa.Core на вкладке "Проекты"
      • открыть Mcrcsip.Amwa.CrFactory на вкладке "Проекты"
      • открыть Mcrcsip.Amwa.PdfFormHandler на вкладке "Проекты"
  2. Убедитесь, что ваше решение использует свежие жесткие ссылки, где это применимо,
    • развернуть Mcrcsip.Amwa.Core
      • развернуть Список литературы
      • удалить ссылку Mcrcsip.Aws.Bol
      • удалить ссылку Mcrcsip.Common
      • удалить ссылку Mcrcsip.Web
      • открыть диалог добавления ссылок
      • открыть Mcrcsip.Aws.Bol на вкладке Обзор [всегда лучше указать местоположение]
      • открыть Mcrcsip.Common на вкладке Обзор
      • открыть Mcrcsip.Web на вкладке "Обзор"
    • развернуть Mcrcsip.Amwa.CrFactory
      • развернуть Список литературы
      • удалить ссылку Mcrcsip.Web
      • открыть диалог добавления ссылок
      • открыть Mcrcsip.Web на вкладке "Обзор"
    • развернуть Mcrcsip.Amwa.PdfFormHandler
      • развернуть Список литературы
      • удалить ссылку Mcrcsip.Web
      • открыть диалог добавления ссылок
      • открыть Mcrcsip.Web на вкладке "Обзор"
    • развернуть Mcrcsip.Amwa.Web
      • развернуть Список литературы
      • удалить ссылку Mcrcsip.Aws.Bol
      • удалить ссылку Mcrcsip.Common
      • удалить ссылку Mcrcsip.SharePoint
      • удалить ссылку Mcrcsip.Web
      • открыть диалоговое окно добавления ссылок
      • открыть Mcrcsip.Aws.Bol из вкладки Обзор
      • открыть Mcrcsip.Common на вкладке Обзор
      • открыть Mcrcsip.SharePoint из вкладки Обзор
      • открыть Mcrcsip.Web на вкладке "Обзор"
  3. Сложение

Если вы все еще сталкиваетесь с ошибками на этом шаге, тогда вы знаете, что один или все из

  • Mcrcsip.Aws.BOL
  • Mcrcsip.Common
  • Mcrcsip.SharePoint

разделяет вашу зависимость от Mcrcsip.Web и ссылается на старую версию. Если это так, то для каждой жесткой ссылки, указанной выше

  1. выберите ссылку
  2. нажмите F4
  3. копировать содержимое из свойства Path
  4. диалог открытия файла в ildasm
  5. вставить в имя файла
  6. проверять манифест

Убедитесь, что вы делаете это для всех и каждого из трех жестких ссылок выше. как только вы определите, какое подмножество из этих трех ссылается на старую версию Mcrcsip.Web, вы можете найти этот проект, обновить его жесткую ссылку, перестроить его, а затем, наконец, обновить ваш Жесткая ссылка, восстановить и вуаля. Боб твой дядя.

Уф.

Le fin

PS извиняюсь за многословие. это не очень сложная проблема, но, как я уверен, вы согласитесь, в ней много деталей. Я действительно надеюсь, что это поможет. спасибо за ваше сотрудничество тоже:)

PPS Кстати, из ваших комментариев я делаю вывод, что оригинальный разработчик использовал жесткие ссылки везде [то есть даже в рамках одного и того же решения]. возможно, у него были свои причины, но имо, это осел.

0 голосов
/ 05 марта 2010

Смотрите другие сборки под опциями Batch Build. Это позволит вам определить приоритетность сборки для сборки, затем зависимости получат свои DLL в соответствии с требованиями в правильном порядке.

0 голосов
/ 04 марта 2010

Если вы щелкнете правой кнопкой мыши по ссылке, перейдите в свойства, для чего установлена ​​«Конкретная версия»? Убедитесь, что для него установлено значение «True», а указанная версия действительно 2.0.x.

На странице свойств дважды проверьте путь. У вас может быть другая версия, зарегистрированная в другом месте вашего GAC, которая получает приоритет. Используйте «gacutil -l» в командной строке, чтобы получить список всех зарегистрированных версий этой сборки. Если вы видите дубликаты с разными ключами, используйте gacutil, чтобы уничтожить тот, который вам не нужен.

...