正如qstarin所提到的,回收AppPool似乎确实会将程序集踢出程序集。以下是关于这个问题的最初的Spark讨论:
http://groups.google.com/group/spark-dev/browse_thread/thread/dbee06a0d1b2766f#
一般来说,该问题似乎是由Spark在AppPool有时间加载所有程序集之前尝试编译视图引起的。
一个接一个地选择程序集似乎仍然会给我带来随机问题,因此我调整了讨论帖子中的代码,并将其作为Application_Start()中的第一行加载。从那时起,我已经推出了十几个应用程序,而且一次都没有看到预编译问题。
private void PreLoadAssemblies()
{
var initialAssemblies = AppDomain.CurrentDomain.GetAssemblies();
var di = new DirectoryInfo(Server.MapPath("~/bin"));
var files = di.GetFiles("*.dll");
foreach (var fi in files)
{
var found = false;
foreach (var asm in initialAssemblies)
{
var a = Assembly.ReflectionOnlyLoadFrom(fi.FullName);
if (asm.FullName == a.FullName)
found = true;
}
if (!found)
Assembly.LoadFrom(fi.FullName);
}
}
然后你的应用程序启动:
protected override void Application_Start(object sender, EventArgs e)
{
PreLoadAssemblies();
base.Application_Start(sender, e);
MvcHandler.DisableMvcResponseHeader = true;
ViewEngineManager.Configure(ViewEngines.Engines);
RouteManager.RegisterRoutes(RouteTable.Routes);
new InjectionManager().StartNinject();
}