Как заставить Visual Studio остановить копирование DLL во время сборки без моего разрешения?

У меня есть проект 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 по умолчанию устанавливает для свойства "Copy Local" значение "True" и копирует эти зависимости в каталог ~/bin моего веб-сайта.

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

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

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

4 ответа

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<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>
Другие вопросы по тегам