Как заставить Visual Studio остановить копирование библиотек DLL во время сборки без моего разрешения? - PullRequest
8 голосов
/ 13 мая 2009

У меня есть проект Visual Studio, который опирается на несколько ссылок на DLL. Вот пример этих ссылок в моем csproj:

<ItemGroup>
  <Reference Include="Class1.Project1">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\bin\Class1.Project1.dll</HintPath>
    <Private>False</Private>
  </Reference>
  <Reference Include="Class1.Project2">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\bin\Class1.Project2.dll</HintPath>
    <Private>False</Private>
  </Reference>
</ItemGroup>

Однако, когда я включаю этот класс в качестве зависимости проекта в проект веб-сайта, Visual Studio находит зависимости, показанные выше. Во время сборки Visual Studio по умолчанию устанавливает для свойства «Копировать локальное» значение «True» и копирует эти зависимости в каталог ~ / bin моего веб-сайта.

Это, в свою очередь, перезаписывает версии файлов DLL, которые уже существуют в этом каталоге. Это вызывает следующую ошибку:

Не удалось загрузить файл или сборку 'Class5.Project5, Версия = 3.6.1861.2, Culture = нейтрально, PublicKeyToken = dfeaee0e3978ac79 'или одна из его зависимостей. Расположенный определение манифеста сборки делает не совпадает со ссылкой на сборку. (Исключение из HRESULT: 0x80131040)

Как сделать Visual Studio по умолчанию для параметра «Копировать локальный» значение «Ложь» для всего ? Я не хочу, чтобы Visual Studio автоматически копировал файлы DLL во время сборки. Также я не хочу связывать свою сборку с очень конкретными версиями DLL.

Ответы [ 4 ]

2 голосов
/ 18 мая 2009

Мне кажется, что у вас есть несколько проектов, сконфигурированных для вывода в один каталог - это правда?

Если это так, вам необходимо проверить свою конфигурацию, поскольку Visual Studio предполагает (нет, требуется ), что каждый проект имеет уникальный выходной каталог.

Также вы написали:

Это, в свою очередь, перезаписывает версии файлов DLL, которые уже существуют в этом каталоге.

Откуда взялись эти существующие файлы?

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

(К сожалению, я говорю по опыту. Вздох).

1 голос
/ 15 мая 2009

Однажды у меня была эта проблема,

При публикации : Самый простой способ предотвратить запись поверх существующих DLL-файлов - установить для них значение ReadOnly. Вы получите предупреждение о публикации для каждого файла, который не может быть заменен, но он выполнит свою работу.

On Build : чтобы автоматически отключить CopyLocal, вам нужно поместить файлы dll в GAC.

0 голосов
/ 03 августа 2012

Вы можете попробовать следующее в вашем файле проекта.

<ReferenceOutputAssembly>false</ReferenceOutputAssembly> 

А затем, в вашем коде попробуйте это.

<ItemGroup>
  <Reference Include="Class1.Project1">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\bin\Class1.Project1.dll</HintPath>
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  </Reference>
  <Reference Include="Class1.Project2">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\bin\Class1.Project2.dll</HintPath>
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  </Reference>
</ItemGroup>
0 голосов
/ 15 мая 2009

Почему в каталоге bin уже были другие версии?

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

Посмотрите, сможете ли вы воспроизвести это, начав с нового проекта веб-приложения и просто добавив ссылки.

...