Как исправить «круговые ссылки на файлы не допускаются» Ошибка в ASP.Net
В одном из моих проектов .Net я столкнулся с интересной проблемой. Я потратил пару часов, чтобы починить его. Поэтому я решил поделиться своими выводами, чтобы другим не пришлось тратить свое время на решение той же проблемы.
выпуск
Проблема была довольно простой, приложение не собиралось. Ошибка, которую я получал при создании веб-проекта ASP.Net с использованием MSBuild:
/someProject/Controls/A/ucA.ascx(2): ошибка ASPPARSE: ссылки на циклические файлы не допускаются.
Конечно, ошибка говорит, что в моем коде есть какая-то круговая ссылка. Я оглянулся вокруг, чтобы проверить и перепроверить, если я создал круговую ссылку по ошибке. Однако, если бы была какая-либо циклическая ссылка, код не компилировался бы. Код компилировался нормально, но не получалось, когда мы запускали aspnet_compiler.exe.
Средство компиляции ASP.Net (aspnet_compiler.exe) позволяет скомпилировать веб-приложение ASP.Net, что способствует повышению производительности приложения, поскольку конечные пользователи не сталкиваются с задержкой при первом обращении к приложению.
Я проверил еще раз, но, конечно, не было циклической зависимости, связанной с кодом, тогда почему aspnet_compiler.exe жаловался на ссылки на циклические файлы?
Объяснение
Немного погуглив, я обнаружил, что по умолчанию в проекте веб-сайта ASP.Net создает одну DLL на папку. Следовательно, если у вас есть следующие настройки:
Пользовательский элемент управления ucA.ascx присутствует в каталоге «А». ucA.ascx ссылается на другой пользовательский элемент управления ucB.ascx
Пользовательский элемент управления ucB.ascx присутствует в каталоге «B». ucB.ascx ссылается на другой пользовательский элемент управления ucC.ascx
Пользовательский элемент управления ucC.ascx присутствует в каталоге «A».
DLL папки A будет ссылаться на DLL папки B, которая снова будет ссылаться на DLL папки A, вызывая «циклическую ссылку на файл».
Это причина, по которой aspnet_compiler.exe завершается с ошибкой «циклическая ссылка на файл».
Исправление
Существует два способа устранения этой проблемы
Перестановка пользовательских элементов управления (или MasterPages) для удаления циклических ссылок. Обычно это означает перемещение пользовательских элементов управления в отдельные каталоги. В нашем примере перемещение ucC.ascx в новый каталог «C» (Preferred Solution).
Используйте batch = ”false” в теге компиляции файла web.config. Это приведет к созданию новой библиотеки DLL для каждого элемента управления / страницы сайта. Это должно исправить ошибку, но очень плохо для производительности, поэтому ее следует избегать.
Я переместил ucC.ascx в другой каталог, и да, ошибка исчезла!