Как заставить 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>