24

所以,我的一个网站有一个 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 : 应用程序启动前初始化方法 Start on type RedactedNameSpace.ServiceStackAppHost 抛出异常以下错误消息:依赖项解析失败,类型=“...”

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

4

2 回答 2

32

简短的回答是您无法阻止它运行,这是设计使然,您可以解决该问题。

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

原因是PreApplicationStartMethod(或构建在它之上的WebActivator)可用于实际影响编译的事情,这样如果您省略它,站点可能无法编译。

举个例子,你可以在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 以在出现错误时获得更完整的堆栈。

于 2012-12-03T18:41:19.717 回答
0

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

于 2012-12-03T13:40:23.620 回答