今天在调试代码的时候出现黄页,Autofac在加载时出现版本不一致,看到报错,一时傻掉了,就一个Autofac怎么会出现版本不一致的问题?
事件查看器中看到的是错误信息是:
程序集“XXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”所使用的“Autofac, Version=2.6.3.862, Culture=neutral, PublicKeyToken=17863af14b0044da”版本高于所引用的程序集“Autofac, Version=2.6.1.841, Culture=neutral, PublicKeyToken=17863af14b0044da”的版本
在 System.Web.Compilation.AssemblyBuilder.Compile()
在 System.Web.Compilation.BuildProvidersCompiler.PerformBuild()
在 System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp)
在 System.Web.Compilation.BuildManager.CompileGlobalAsax()
在 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
在 System.Web.Compilation.BuildManager.CallAppInitializeMethod()
在 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)
非常奇怪的是,不是每次重新编译都会出来,而是不定期出现。检查当前Web程序中的Autofac的引用,是2.6.3.862版本,怀疑是系统缓存报错,因为一开始的时候引用过Autofac后面删除过,后面寻着报错的路径在系统的ASP.NET临时目录中删除了这个报错的Autofac.dll,报错仍然不时出现。这就说明还有问题。
在检查一圈系统引用经来的项目中,发现另外还有一个项目也引用了Autofac,版本正好是2.6.1.841,原来是它!当时将功能整合进新项目中,更新的时候忘掉删除引用了,导致在引用的时候将两个Autofac的版本都引用进来了,在编译的时候,因为系统bin下不可能存放两个同名文件,系统随机(先编译先引用)的将两个版本中的一个版本放入bin中,这势必导致其中一个在运行时出现问题。但由于老版本Autofac所在项目功能被否决之后,没有调用,就不会触发系统错误,也因此,一直没有发现这里还存在老版本。而一旦出现Autofac的版本是老版本时,新调用的功能将出现错误,没有办法正常运行。
删掉原来项目中的老版本Autofac,问题解决。留下的疑问是:系统编译的时候,后编译的项目引用的同一个dll的不同版本,是不是会覆盖上一个引入的dll?在我的理解,应该是会的,不然系统在编译的时候就会发现版本的不一致,从而导致编译失败。测试的时候,是编译通过之后,在运行的时候,系统出现问题的。这点应该可以说明。 但具体的没有仔细研究,有知道的兄弟们可以告知下:-)。