在将Lucene.net和Lucene.net Contrib添加到C#MVC3之后,在第一次成功运行后,我得到了下面的消息。 收到此错误后,我需要完全清除C:\ Users \ Me \ AppData \ Local \ Temp \ Temporary ASP.NET Files,然后才能再次运行该项目。
我尝试手动删除Lucene文件(包括我的项目中的引用),并重新安装它们 – 无论是与NuGet和手动 – 但它总是相同的情况; 项目运行一次后,我开始得到以下错误:
注意:Contrib.Regex是Lucene.net Contrib的一部分。
Server Error in '/' Application. Could not load types from assembly Contrib.Regex, Version=2.9.4.0, Culture=neutral, PublicKeyToken=85089178b9ac3181, errors: Exception: System.IO.FileLoadException: Could not load file or assembly 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) File name: 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181' === Pre-bind state information === LOG: User = rcw7\Me LOG: DisplayName = Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181 (Fully-specified) LOG: Appbase = file:///C:/Development/Projects/Foobar/Foobar/ LOG: Initial PrivatePath = C:\Development\Projects\Foobar\Foobar\bin Calling assembly : Contrib.Regex, Version=2.9.4.0, Culture=neutral, PublicKeyToken=85089178b9ac3181. === LOG: This bind starts in default load context. LOG: Using application configuration file: C:\Development\Projects\Foobar\Foobar\web.config LOG: Using host configuration file: C:\Users\Me\Documents\IISExpress\config\aspnet.config LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Post-policy reference: Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181 LOG: Attempting download of new URL file:///C:/Users/Me/AppData/Local/Temp/Temporary ASP.NET Files/root/e9b4cfa4/edfa73f8/Lucene.Net.DLL. WRN: Comparing the assembly name resulted in the mismatch: Revision Number ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated. Exception: System.IO.FileLoadException: Could not load file or assembly 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) File name: 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181'
完整的输出在这里: http : //pastebin.com/Vbu4VK7B
起初,我认为这是我的开发环境本地的问题,但重build和复制项目到我们的服务器后,我得到同样的错误。
任何build议如何克服这一点? 🙂
事实证明,DLL地狱不是由我自己的干涉配置和编译库引起的。 这实际上是由我新下载的Lucene.NET版本和一个与Examine捆绑在一起的有点过时的版本之间的碰撞造成的,而这个版本又与Umbraco 5捆绑在一起。
显然过时的捆绑Lucene.NET结束了影子缓存(Temporary ASP.NET Files),所以在下一次编译或IIS重启之后,执行就会中断。 清除阴影缓存将允许执行一次成功。
奇怪的是,我无法在调试输出中的任何地方找到暗示过时版本Lucene.NET的任何引用,无论是使用目录路径还是版本号。 通过比较Lucene.NET的阴影复制版本和我打算使用的版本的文件大小来发现问题。 他们关闭了,所以我搜索了Lucene.NET.dll,并在Umbraco树(在\ App_Plugins \ Examine下)找到了一个与Examine捆绑在一起的程序。
快速解决方案是简单地压缩检查插件,所以Umbraco不会看到它。 这使我没有检查插件,但我没有使用它。
正确的解决方案可能是告诉应用程序,它应该忽略Lucene.NET的以前的版本,但我到目前为止没有任何运气。 这是我添加到web.config:
<dependentAssembly> <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.9.4.1" newVersion="2.9.4.1" /> </dependentAssembly>
这似乎没有任何影响,过时的版本仍然在影子缓存中结束。 我在这里提出这个问题: 我如何使Umbraco 5忽略捆绑(与审查)Lucene.NET
感谢您的帮助和建议 – 它指出了我正确的方向! 🙂
这通常意味着您在GAC中具有不同版本的文件,并且您的文件夹中的文件是另一个版本。 所以你的应用程序指向一个版本,它正在寻找另一个版本。 它变得困惑。 你想要做的就是卸载Lucene.net。 卸载后,查看c:\ windows \ assembly文件夹,并确保在那里没有Lucene文件。 如果有,请右键单击并卸载。 然后你可以再次安装。
manifest definition does not match
意味着程序集的解析有问题。 看到这个问题
[编辑]
程序集从GAC加载,然后在你的应用程序中加载lib / bin目录,然后在你的项目中通过<HintPath>
指定目录。 检查你有没有
Specific Version = True
, Copy Local = True
在参考的属性窗口中。
来自应用程序(lib / bin目录)中私有路径的程序集是唯一受到影子复制的程序集。 有可能Contrib.Regex被阴影复制,而Lucene.NET核心没有。
[/编辑]
您要清除的ASP.NET Temporary Files
下的目录是shadow-copy目录。 这个程序集的复制方式可能存在问题,这可能是您的域帐户的权限。 您可以通过更改shadowcopy目录或完全关闭shadowcopying来测试此理论,如下所述:
您可以在Application_Start中更改此目录,如https://stackoverflow.com/a/2847495/151445中所述
您可以在web.config中关闭阴影复制:
<hostingEnvironment shadowCopyBinAssemblies="false" />
您可以使用Fusion Log Viewer来诊断这个问题。 它为您提供了类似于您在这里报告的类型未能加载类型的全部细节。 希望这可以帮助。