C# 避免aspnet_编译器运行PreApplicationStart方法

C# 避免aspnet_编译器运行PreApplicationStart方法,c#,asp.net,.net,aspnet-compiler,C#,Asp.net,.net,Aspnet Compiler,因此,我的一个网站有一个PreApplicationStartMethod,应该在应用程序启动之前运行: [assembly: PreApplicationStartMethod(typeof(ServiceStackAppHost), "Start")] 此方法执行一些引导,并依赖于设置的一些配置 现在,我想将网站编译作为我的自动构建过程的一部分-因此我调用aspnet_compiler.exe,它失败了,因为它运行preapplicationstart方法: 后构建: C:\Windows

因此,我的一个网站有一个PreApplicationStartMethod,应该在应用程序启动之前运行:

[assembly: PreApplicationStartMethod(typeof(ServiceStackAppHost), "Start")]
此方法执行一些引导,并依赖于设置的一些配置

现在,我想将网站编译作为我的自动构建过程的一部分-因此我调用aspnet_compiler.exe,它失败了,因为它运行preapplicationstart方法:

后构建:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet\u compiler.exe-v temp-p C:\Projects\error ASPRUNTIME:预应用程序 启动初始化方法启动类型 RedactedNameSpace.ServiceStackAppHost引发了一个异常 以下错误消息:依赖项解析失败,键入= “…”


如何避免aspnet_compiler.exe在编译网站时调用PreApplicationStartMethod?

PreApplicationStartMethod是用于在构建过程的早期加载代码的程序集属性。编译器必须加载并运行此代码才能开始编译过程。PreApplicationStartMethod类似于构建过程,而不是初始化过程。因此,您可以尝试将代码放入global.asax中的应用程序启动方法中

简单的回答是,你不能阻止它运行,这是出于设计,但你可以解决这个问题

为什么在aspnet_compiler.exe期间运行预应用程序启动方法 原因是,
PreApplicationStartMethod
(或者,构建在它之上)可以用于实际影响编译的事情,因此如果您省略它,站点可能无法编译

举个例子,您可以在
PreAppStart
方法中将名称空间添加到编译中,这会影响Razor页面的编译

显然,当您使用aspnet\u预编译器时,并不是每个
PreAppStart
方法都需要运行,但如果需要,我们会运行所有方法

检测您是否在aspnet_compiler.exe下运行 如果其中的代码在aspnet_编译器下中断,则可能需要在
PreAppStart
方法中添加条件逻辑以检测情况并忽略运行代码

您可以查看
System.Web.Hosting.HostingEnvironment.InClientBuildManager
属性,以确定您的
PreAppStart
方法是在aspnet\u compiler.exe的上下文下运行(其中为
true
),还是在运行时运行(其中为
false
InClientBuildManager
也适用于在VS中构建网站,它使用与aspnet_compiler.exe基本相同的代码路径

尝试改用PostStart方法 请注意,WebActivator还支持
PostApplicationStartMethod
,这些将不会在aspnet\u编译器下运行。该代码在应用程序启动后运行,因此它可能适合您的场景,也可能不适合您的场景。但这可能是你的解决办法

aspnet_compiler.exe调试提示
不直接相关但对调试有用:当出现错误时,可以将-errorstack传递给aspnet_compiler.exe以获得更完整的堆栈。

绕过此方法有什么意义?如果从aspnet_compiler.exe调用时无法在启动时设置“PreApplicationStart”上设置的配置,您将如何执行其他操作???aspnet_compiler应该编译网站,而不是运行它。我希望在将应用程序移动到可以实际运行的环境之前,能够验证没有编译时错误。您的项目必须包含Global.asax,对吗?有人特别提到,在编译开始之前,它被称为“way-early”。诚然,这并不是关于预编译。您需要使用
PreApplicationStart
,还是可以将其中的代码移到其他地方?“编译器必须加载并运行此代码才能开始编译过程。”这完全是错误的。您可以尝试解决方案!是的,把代码放在应用程序中开始工作。问题是它是否能与PreApplicationStart一起工作。同意!那么我的答案是“不”。这是不能忽略的。如果您遇到错误,您可以避免它。但PreApplicationStartMethod仍将运行。只是添加了有关使用WebActivator
PostApplicationStartMethod
的信息。有没有办法实际检测到您是在编译模式下运行,而不是作为一个实时网站运行?@BennorMcCarthy我刚刚添加了有关使用
InClientBuildManager
检测的信息,只是注意到了这一点这种情况发生在我身上是因为在PreStart中进行了IoC初始化,因为我有松散的引用,这些引用是通过反射解决的。由于我用于复制这些引用的MSBuild/MSDeploy目标发生在生成之后,因此我在尝试发布到IIS实例时遇到此错误。在我来到这里之前,我不得不通过其他几个步骤来缩小这个范围,并希望这一提到web部署发布会收紧谷歌的搜索结果;P