问题 C#:无法从程序集加载类型


在将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

最初我认为这是我的开发环境本地的问题,但在重建并将项目复制到我们的服务器后,我得到了相同的错误。

任何建议如何克服这个? :-)


12932
2018-04-24 12:37


起源



答案:


事实证明,DLL地狱不是由我自己干预配置和编译库造成的。事实上,这是由于我新下载的Lucene.NET版本与一个与Examine捆绑在一起的有点过时的版本之间的冲突引起的,后者又与Umbraco 5捆绑在一起。

显然,过时的,捆绑的Lucene.NET最终进入了影子缓存(Temporary ASP.NET Files),所以在下次编译或IIS重启后,执行会中断。清除影子缓存将允许一次成功执行。

奇怪的是,我无法在调试输出中的任何地方找到任何引用,暗示Lucene.NET的过时版本,无论是使用目录路径还是版本号。通过比较Lucene.NET的卷影复制版本和我打算使用的版本的文件大小来发现问题。他们关闭了,所以我搜索了Lucene.NET.dll并找到了与Umbraco树中的Examine捆绑的一个(在\ App_Plugins \ Examine下)

快速解决方案是简单地压缩Examine插件,因此Umbraco不会看到它。这让我没有使用Examine插件,但无论如何我都没有使用它。

 解决方案可能是告诉应用程序它应该忽略以前版本的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忽略捆绑(使用Examine)Lucene.NET

感谢您的帮助和建议 - 它指出了我正确的方向! :-)


6
2018-04-26 11:29





这通常意味着您在GAC中的文件是不同的版本,而在您的bin中的文件是另一个版本。所以你的应用程序指向一个版本,它正在寻找另一个版本。它变得困惑。你想要做的是卸载Lucene.net。卸载后,查看c:\ windows \ assembly文件夹,确保其中没有Lucene文件。如果有,请右键单击并卸载。然后你可以再次安装。


3
2018-04-24 12:43



与应用程序的bin目录和GAC相比,查看c:\ windows \ assemblies的优先级是什么?我希望系统目录是最后的手段? - Saustrup
我认为GAC会覆盖任何其他位置。 - Alex Mendez
C:\ WINDOWS \组件 是 GAC。它仅在引用不需要特定版本时才会覆盖,在这种情况下,使用较新的引用。 - Jim Schubert
啊,对不起,我的意思是GAC(c:\ windows \ assemblies),我的本地卷影副本(ASP.NET临时文件)和应用程序的bin目录的优先级。 - Saustrup


答案:


事实证明,DLL地狱不是由我自己干预配置和编译库造成的。事实上,这是由于我新下载的Lucene.NET版本与一个与Examine捆绑在一起的有点过时的版本之间的冲突引起的,后者又与Umbraco 5捆绑在一起。

显然,过时的,捆绑的Lucene.NET最终进入了影子缓存(Temporary ASP.NET Files),所以在下次编译或IIS重启后,执行会中断。清除影子缓存将允许一次成功执行。

奇怪的是,我无法在调试输出中的任何地方找到任何引用,暗示Lucene.NET的过时版本,无论是使用目录路径还是版本号。通过比较Lucene.NET的卷影复制版本和我打算使用的版本的文件大小来发现问题。他们关闭了,所以我搜索了Lucene.NET.dll并找到了与Umbraco树中的Examine捆绑的一个(在\ App_Plugins \ Examine下)

快速解决方案是简单地压缩Examine插件,因此Umbraco不会看到它。这让我没有使用Examine插件,但无论如何我都没有使用它。

 解决方案可能是告诉应用程序它应该忽略以前版本的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忽略捆绑(使用Examine)Lucene.NET

感谢您的帮助和建议 - 它指出了我正确的方向! :-)


6
2018-04-26 11:29





这通常意味着您在GAC中的文件是不同的版本,而在您的bin中的文件是另一个版本。所以你的应用程序指向一个版本,它正在寻找另一个版本。它变得困惑。你想要做的是卸载Lucene.net。卸载后,查看c:\ windows \ assembly文件夹,确保其中没有Lucene文件。如果有,请右键单击并卸载。然后你可以再次安装。


3
2018-04-24 12:43



与应用程序的bin目录和GAC相比,查看c:\ windows \ assemblies的优先级是什么?我希望系统目录是最后的手段? - Saustrup
我认为GAC会覆盖任何其他位置。 - Alex Mendez
C:\ WINDOWS \组件 是 GAC。它仅在引用不需要特定版本时才会覆盖,在这种情况下,使用较新的引用。 - Jim Schubert
啊,对不起,我的意思是GAC(c:\ windows \ assemblies),我的本地卷影副本(ASP.NET临时文件)和应用程序的bin目录的优先级。 - Saustrup


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" />


3
2018-04-24 12:55



我试图通过删除<system.web>下的web.config中的<hostingEnvironment>行来关闭卷影复制,但我仍然在shadow-copy目录中获取DLL? - Saustrup
只有在文件更新后,ApplicationPool中才有现有的AppDomain,才会发生这种情况。这是因为IIS为每个AppDomain缓存web.config,如果一个AppDomain的缓存web.config具有较旧的设置,则更新的文件仍将被阴影复制。但是,新的AppDomain不应受此影响。我将重新启动Visual Studio和IIS以确保没有陈旧的AppDomain并查看它是否仍然发生。 - Jim Schubert


你可以使用 Fusion Log Viewer 诊断这个问题。它为您提供了类似于您在此处报告的类型无法加载的类型的完整详细信息。希望这可以帮助。


2
2018-04-24 12:53



我似乎无法使Fusion日志查看器工作 - 尝试以管理员身份运行它,但似乎没有任何东西出现,即使我的项目崩溃。它是否会在IIS Express下运行有什么不同? - Saustrup
请确保通过“设置...”按钮启用“日志设置”中的“启用所有绑定到磁盘”复选框。运行应用程序后,“刷新”。如果这有帮助,请告诉我。 - RajN
啊,现在让它工作 - 必须选择“记录所有绑定到磁盘”并指定一个自定义日志路径,如C:\ tmp - 立即调查:-) - Saustrup