2013-08-28 3 views
0

У меня есть проект .net C#, который имеет несколько ссылок на внешние DLL, некоторые из них - мои собственные сборки ядра, а некоторые - сторонние (например, NewtownSoft.Json). Когда я компилирую свои основные сборки, скомпилированные DLL переносятся в локальный каталог (что-то вроде от/debug/bin), например/development/common/binaries. Мой проект C# затем ссылается на мои основные сборки здесь, а сборка ядра будет скопирована в выходной каталог для проекта.ASP.NET Assembly version hell

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

Любые идеи? Я исследовал эту тему здесь и в Google, но на самом деле не нашел решения. Если эта тема была освещена, пожалуйста, сообщите. Я компилирую 3.5 .NET.

Спасибо, Karl ..

+1

Вы пробовали Clean Solution? –

+0

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

+2

сборка может быть скопирована, поскольку одна из ссылочных сборок использует эту версию. Просмотрите файлы проекта (в текстовом редакторе), на которые ссылаются сборки и с какого пути они происходят. – slfan

ответ

0

Я держаться подальше от этого мира:

Изменение структуры папок на это:

.\MySolution.sln 
.\MyFirstProject\MyFirstProject.csproj 
.\MySecondProject\MySecondProject.csproj 
.\MyThirdProject\MyThirdProject.csproj 
.\MyOtherProject\SomeFolder\MyOtherProject.csproj 
.\ThirdPartyReferences\ 

Положите все ваши ссылки сборок в»\. ThirdPartyReferences \». Есть все csproj ссылаться на .dll-й с помощью «.. \ ThirdPartyReferences \ MyCoolDll.dll» (однако многие «..» вам нужно)

каждого csproj должен использовать ту же версию и происходящее местоположение любого сторонние ссылки.

+0

Гранада, это именно то, что я делаю, а не именно ваша файловая структура, но мои намерения - то же самое. Хотя, не знаю, каковы ваши намерения MyCoolDLL.dll или просто имя dummy dll? – kstubs

+0

Просто фиктивное имя. – granadaCoder

1

Использовать NuGet для сторонних зависимостей. Каждый проект определяет, какие зависимости он имеет, и какие версии этих зависимостей он использует. После сборки NuGet получит нужные вам версии.

Загрузить NuGet (если ваша версия VisualStudio еще не установлена), установите его, откройте окно Package Manager Console и запустите что-то вроде Install-Package Newtonsoft.Json. Все сделано :)


В качестве альтернативы вы можете использовать granadaCoders подход, который был типичным, прежде чем инструменты управления посвященного зависимостей (например, NuGet или Maven).

общий подход существует для настройки структуры каталогов Раствор, как:

.\bin <-- if you're doing continuous integration then your most recently built 
      versions are placed in the bin folder 
.\docs <-- docs is a home for any documentation related to the project 
.\lib <-- lib is the root of all your third-party dependencies 
.\lib\{packagename}\ <-- each package gets it's own folder, such as 
          Newtonsoft.Json. All projects reference the package 
          from here with a relative path. If you update the 
          third party assembly then all dependent projects get 
          the update. 
.\src <-- src is the root of all your releasable source code 
.\src\MySolution.sln <-- your Solution 
.\src\AProject\ <-- each project gets its own folder in src for all its contents 
.\test <-- test is the root for all your test projects (unit/integration/etc) 
.\test\AProjectTests\ <-- each test project gets its own folder 
+1

Вы также можете использовать GUI менеджера пакетов, если вы занимаетесь подобным делом. В VS2012: Нажмите «Инструменты»> «Диспетчер пакетов библиотек»> «Управление пакетами NuGet для решения ...». – absynce

0

Если ваш проект является проектом WEB SITE, в отличие от WEB APPLICATION проекта, который совсем другое дело ... тогда это поведение ожидается.

По существу, при работе с проектами Web Site Visual Studio будет переделывать ссылки на сборку, если она находит версию GAC 'd или вдоль любого из путей поиска. Это абсолютно безумное поведение, и я понятия не имею, почему они думали, что это хорошо. Но я отвлекся.

Чтобы остановить Visual Studio от этого, у вас есть два варианта. Либо преобразовать решение в проект веб-приложения (который вы должны использовать в любом случае), затем исправить ссылки ИЛИ вытащить сборки, которые он ссылается, из GAC.

По правде говоря, я рекомендую идти вперед и делать оба решения. GAC 'сборки - это просто плохая идея и, как правило, приводит к достаточному нежелательному поведению. Конечно, я знаю, что некоторые компании (включая Infragistics), которые рекомендуют устанавливать их дерьмо в GAC. Проблема возникает, когда у вас есть несколько приложений, которые имеют зависимости от разных версий (особенно веб-сайтов), и один обновляется ...

0

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

  • Удаляется Справочной
  • Добавлена ​​новая версия библиотеки DLL
  • Set "Copy Local" ложному
  • чистого раствора
  • Построить
  • Set "Copy Local" обратно верно для библиотек DLL, которые требуется

Это кажется обманчиво простым, но процесс не подвел меня поскольку.