避免运行PreApplicationStart方法的aspnet_compiler

时间:2012-11-30 09:51:52

标签: c# asp.net .net aspnet-compiler

所以,我的一个网站有一个应该在应用程序启动之前运行的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?

2 个答案:

答案 0 :(得分:31)

简短的回答是你无法阻止它运行,而且这是设计但是你可以解决这个问题。

为什么在aspnet_compiler.exe期间运行PreApplicationStart方法

原因是PreApplicationStartMethod(或WebActivator,它构建在它之上)可以用于实际影响编译的事情,这样如果你省略了它,那么网站可能无法编译。 / p>

为了举例说明,您可以使用PreAppStart方法将命名空间添加到编译中,然后影响Razor页面的编译。

显然,当您使用aspnet_precompiler时,不是每个PreAppStart方法都需要运行,但我们会在需要时运行所有这些方法。

检测您是否在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,以便在出现错误时获得更完整的堆栈。

答案 1 :(得分:0)

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