所以,我的一个网站有一个应该在应用程序启动之前运行的PreApplicationStartMethod:
[assembly: PreApplicationStartMethod(typeof(ServiceStackAppHost), "Start")]
此方法执行一些引导并依赖于某些配置。
现在,我想将网站编译为自动构建过程的一部分 - 所以我调用aspnet_compiler.exe,因为它运行PreApplicationStartMethod而失败:
AfterBuild:
C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ aspnet_compiler.exe -v temp -p C:\ Projects \ error ASPRUNTIME:预应用程序 启动初始化方法启动类型 RedactedNameSpace.ServiceStackAppHost引发了一个异常 以下错误消息:依赖项的解析失败,键入= “...”
编译网站时,如何避免aspnet_compiler.exe调用PreApplicationStartMethod?
答案 0 :(得分:31)
简短的回答是你无法阻止它运行,而且这是设计但是你可以解决这个问题。
原因是PreApplicationStartMethod
(或WebActivator,它构建在它之上)可以用于实际影响编译的事情,这样如果你省略了它,那么网站可能无法编译。 / p>
为了举例说明,您可以使用PreAppStart
方法将命名空间添加到编译中,然后影响Razor页面的编译。
显然,当您使用aspnet_precompiler时,不是每个PreAppStart
方法都需要运行,但我们会在需要时运行所有这些方法。
如果aspnet_compiler中的代码中断,可能需要在PreAppStart
方法中添加条件逻辑来检测情况并省略运行代码。
您可以查看System.Web.Hosting.HostingEnvironment.InClientBuildManager
有关确定您的PreAppStart
方法是在aspnet_compiler.exe(它将是true
)的上下文中运行,还是在运行时(在运行时)将是false
)。 InClientBuildManager
也适用于在VS中构建网站,该网站使用与aspnet_compiler.exe基本相同的代码路径。
请注意,WebActivator还支持PostApplicationStartMethod
,并且这些不会在aspnet_compiler下运行。该代码在 Application_Start
之后运行,因此它可能适合您的方案,也可能不适合您的方案。但它可能是你的解决方案。
与调试没有直接关系但有用:您可以将-errorstack传递给aspnet_compiler.exe,以便在出现错误时获得更完整的堆栈。
答案 1 :(得分:0)
PreApplicationStartMethod是一个程序集属性,用于在构建过程中尽早加载代码。编译器必须加载并运行此代码才能开始编译过程。 PreApplicationStartMethod类似于构建过程而不是初始化过程。因此,您可以尝试将代码放入global.asax !!中的Application_Start方法中。