В проектах веб-сайтов Visual Studio (в Visual Studio 2005 или более поздних версиях, а не в проектах веб-приложений, где все еще есть файл .csproj) как хранится справочная информация и можно ли управлять ее исходным кодом, не сохраняя скомпилированные двоичные файлы в системе управления версиями?
Если вы щелкните правой кнопкой мыши проект веб-сайта и выберите «Страницы свойств», на первом экране («Ссылки») будут перечислены все ссылки на проект.
Ссылки System. * Указаны как тип GAC, а другие файлы DLL могут быть указаны как BIN или Project.
Проблема возникает, когда вы включаете что-то в качестве ссылки на проект, а затем фиксируете это в системе управления версиями (для нас, Subversion, игнорируя файлы .dll и .pdb).
Другой разработчик получает обновленный код из репозитория и должен вручную настроить все эти ссылки на проекты, но я даже не могу определить, где хранится эта информация, если только она не находится в этом .suo, который НЕ является дружественным к системе управления версиями.
Если вы ссылаетесь на .dll по имени файла на вкладке обзора, должен быть создан файл .refresh (вложенный в dll в BIN). Мы помещаем их в SVN, и он отлично работает (возможно, вам придется вручную отредактировать их, чтобы использовать относительные пути).
Ссылки, добавленные из вкладки .NET, добавляются в web.config.
Ссылки на проекты хранятся в файле решения (.sln). Откройте файл .sln, и вы увидите их в списке:
Project("{xxxxxxx-7377-xxxx-xxxx-BC803B73C61A}") = "XXXXXXX.Web", "XXXXXXX.Web", "{xxxxxxxx-BB14-xxxx-B3B6-8BF6D8BC5AFF}"
ProjectSection(WebsiteProperties) = preProject
TargetFramework = "3.5"
ProjectReferences = "{xxxxxxxx-C3AB-xxxx-BBED-2055287036E5}|XXXXXX.Data.dll;
...
Я использую copyprojectDll.ps1 powershell.
Моя структура папок ниже
ClassLibraries - это классы кода для моего проекта DAL .. Проект веб-сайта включает только веб-файлы, aspx, aspx.cs .. ThirdParty - это обязательные библиотеки, AjaxToolkit и т. д.
Компилирую ClassLibraries.sln Запускаю CopyprojectDll.ps1 После этого я использую Website.sln.
Ниже приведен образец файла PowerShell.
$ папки = @ (); $ папки + = "IB.Security" $ папки + = "Библиотеки классов / Core.Classes"
функция CopyDllsToWebBin ($ dll_files) { если ($ dll_files -eq $ null) { возвращаться; } $ targetfolder = "./Kod/bin/"
foreach($dll in $dll_files)
{
copy-item $dll.FullName -destination "$targetfolder" -force #-Verbose
}
}
функция CopyDllsToThirdParty ($ dll_files) {
$ targetfolder = "./ThirdParty/"
foreach($dll in $dll_files)
{
copy-item $dll.FullName -destination "$targetfolder" -force #-Verbose
}
}
$ dll_output_folder = "/ bin / debug";
foreach ($ папка в $ папках) { $ dll_files = Get-ChildItem -Path $ folder $ dll_output_folder -include * .dll -Recurse | имя объекта сортировки CopyDllsToWebBin ($ dll_files) $ dll_files = Get-ChildItem -Path $ folder $ dll_output_folder -include * .pdb -Recurse | имя объекта сортировки CopyDllsToWebBin ($ dll_files) $ dll_files = Get-ChildItem -Path $ folder $ dll_output_folder -include * .xml -Recurse | имя объекта сортировки CopyDllsToWebBin ($ dll_files) "Скопирована $ папка $ dll_output_folder"
}
$ dll_files = Get-ChildItem -Path "ThirdParty" -include * .dll -Recurse | имя объекта сортировки CopyDllsToWebBin ($ dll_files) $ dll_files = Get-ChildItem -Path "ThirdParty" -include * .pdb -Recurse | имя объекта сортировки CopyDllsToWebBin ($ dll_files) $ dll_files = Get-ChildItem -Path $ folder $ dll_output_folder -include * .xml -Recurse | имя объекта сортировки CopyDllsToWebBin ($ dll_files)
«Скопировано ThirdParty»
датировать
Проекты «Веб-сайт» в Visual Studio - странная вещь. Они кажутся попыткой угодить традиционным веб-разработчикам, где «сайт» - это просто набор файлов в каталоге. Точно так же, когда вы создаете проект «Веб-сайт» в Visual Studio, настоящего файла «проекта» не существует, как в проектах C# есть файл .csproj. Однако есть еще файл решения (.sln). Обычно ссылки на сборку .dll сохраняются в файле проекта. Если у веб-сайта его нет, куда им идти?
Ссылки на другие проекты
Если вы добавляете ссылку на другой проект, то в файле решения .sln делается запись. В итоге это выглядит так:
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "WebSite1", "..\..\WebSites\WebSite1\", "{F25DB9D6-810D-4C18-ACBB-BFC420D33B20}"
ProjectSection(WebsiteProperties) = preProject
TargetFramework = "3.5"
ProjectReferences = "{11666201-E9E8-4F5A-A7AB-93D90F3AD9DC}|ClassLibrary1.dll;"
Ссылки на файловую систему
Если вы просмотрите файловую систему и добавите файл .dll, Visual Studio создаст файл «.refresh» с тем же именем в папке \ Bin. Этот файл представляет собой всего лишь однострочный текстовый файл, который указывает путь, из которого файл был загружен. Так, например, если бы я добавил «MyAssem.dll» из .... \ libs, а затем в папку Web Site \ Bin, я бы скопировал туда 2 файла: MyAssem.dll и MyAssem.dll.refresh. Файл .refresh будет содержать текст: «.... \ libs». При каждой сборке Visual Studio будет проверять путь в файле .refresh, и если там существует более новый .dll, он перезапишет тот, который находится в каталоге Bin.
Предупреждение: Visual Studio НЕ выдаст ошибку, если файл не существует там, где файл .refresh указывает его искать. Он просто продолжит использовать .dll, уже находящийся в папке \ Bin. Однако он выдаст предупреждение.
Ссылки GAC
Если вы добавите сборку из глобального кэша сборок, Visual Studio внесет ее в файл Web.config, например:
<compilation debug = "false"> <assemblies> <add assembly = "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
Опять же, вы должны обратить внимание на то, что Visual Studio предполагает, что если сборка находилась в GAC на вашем компьютере разработки, то она будет в том же месте во время выполнения! Это может вызвать у вас проблемы, если у вас, возможно, установлен Oracle.DataAccess
на вашем компьютере разработчика, который поместит его в GAC, но при развертывании вы просто копируете .dll на место на производственной машине. Он по-прежнему будет пытаться найти его в GAC и может потерпеть неудачу во время выполнения.
Я надеюсь, что это поможет прояснить странности веб-сайтов и то, как работают ссылки!
Очень полезный пост в блоге на эту тему. Спасибо.
К сожалению, ссылка, похоже, больше не активна.
@lgaud: ой, извините, я только что отключил свой хостинг, потому что это было опубликовано сегодня утром. Я где-то сделал копию ... Если я найду, я дополню свой ответ полным текстом вместо ссылки.
Спасибо чувак! У меня всегда были проблемы со ссылками на проекты, и я не замечал, что файл sln меняется, когда я добавляю ссылку на проект.