Ответ 1
Короткий ответ заключается в том, что вы не можете предотвратить его запуск, и что это по дизайну, но вы можете решить эту проблему.
Почему методы PreApplicationStart запускаются во время aspnet_compiler.exe
Причина в том, что PreApplicationStartMethod
(или WebActivator, который строится поверх него) может использоваться для вещей, которые действительно влияют компиляции, так что если вы опустили его, сайт не может компилироваться.
Чтобы дать вам пример, вы можете добавить пространства имен в компиляцию в методе PreAppStart
, который затем влияет на компиляцию ваших страниц Razor.
Очевидно, что не каждый PreAppStart
метод нуждается в для запуска, когда вы используете aspnet_precompiler, но мы выполняем все их в случае необходимости.
Обнаружение того, работаете ли вы в aspnet_compiler.exe
Если код там разрывается под aspnet_compiler, может потребоваться добавить условную логику в метод PreAppStart
для обнаружения ситуации и пропустить запуск кода.
Вы можете посмотреть System.Web.Hosting.HostingEnvironment.InClientBuildManager
свойство, чтобы определить, работает ли ваш метод PreAppStart
в контексте aspnet_compiler.exe(где он будет true
) или во время выполнения (где он будет false
), InClientBuildManager
также применяется для создания веб-сайта в VS, который использует в основном тот же путь кода, что и aspnet_compiler.exe.
Попробуйте вместо этого использовать методы PostStart
Обратите внимание, что WebActivator также поддерживает PostApplicationStartMethod
, и они не будут выполняться в aspnet_compiler. Этот код работает после Application_Start
, поэтому он может быть или не соответствовать вашему сценарию. Но это может быть для вас решением.
aspnet_compiler.exe Совет отладки
Непосредственно, но полезно для отладки: вы можете передать -errorstack в aspnet_compiler.exe, чтобы получить более полный стек при возникновении ошибки.