我正在尝试在C#Windows窗体应用程序(Visual Studio 2005)中运行一些单元测试,但出现以下错误:

System.IO.FileLoadException:未能加载文件或程序集“Utility,Version=1.2.0.200,Culture=neutral,PublicKeyToken=764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT的异常:0x80131040)**位于x.Foo.FooGO()位于Foo.cs:line 123中的x.Foo.Foo2(String groupName_)位于FooTests.cs:line 98中的x.Foo.UnitTests.FooTests.TestFoo()**System.IO.FileLoadException:未能加载文件或程序集“Utility,Version=1.2.0.203,Culture=neutral,PublicKeyToken=764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT的异常:0x80131040)

我查阅了我的参考资料,我只参考了实用程序版本1.2.0.203(另一个是旧版本)。

关于我如何找出试图引用此DLL文件的旧版本的内容,有什么建议吗?

此外,我想我的硬盘上甚至没有这个旧组件。是否有任何工具可以搜索此旧版本的程序集?


当前回答

这个问题由来已久,我最近在Azure DevOps Yaml管道和Dotnet Core 3.1中收到了同样的错误消息。这个问题与其他答案试图解决的问题有些不同,因此我将分享我的解决方案。

我有一个解决方案,为我自己的nuget包提供了许多项目。我无意中在*.csproj文件中添加了版本标记,如下所示:

  <Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <Version>1.0.0</Version>
  </PropertyGroup>

我用一个DotnetCoreCLI@2任务:

 - task: DotNetCoreCLI@2
   displayName: 'pack'
   inputs:
     command: pack
     nobuild: true
     configurationToPack: 'Release'
     includesource: true
     includesymbols: true
     packagesToPack: 'MyNugetProject1.csproj;**/MyNugetProject2.csproj'
     versioningScheme: 'byEnvVar'
     versionEnvVar: 'GitVersion.SemVer'

问题是*.csproj文件中的版本与环境变量GitVersion.SemVer(由输入“versionEnvVar”指定)中的版本不匹配。

删除*.csproj文件中的所有<Version>1.0.0</Version>-标记后,dll的程序集/fileversion由环境变量自动分配,nuget和dll(程序集/file版本)将具有相同的版本,问题得到解决。

其他回答

如果尝试使用反射进行后期绑定,如果绑定到的程序集具有强名称或其公钥标记已更改,则会引发完全相同的错误。即使实际上没有使用指定的公钥令牌找到任何程序集,错误也是一样的。

您需要添加正确的公钥令牌(可以使用dll上的sn-T获取它)以解决错误。希望这有帮助。

在Team Foundation Server的生成服务上生成时遇到此错误。结果发现,我的解决方案中有多个项目,使用NuGet添加的同一库的不同版本。我删除了NuGet的所有旧版本,并添加了新版本作为所有版本的参考。

Team Foundation Server将所有DLL文件放在一个目录中,当然,一次只能有一个具有特定名称的DLL文件。

我在尝试更新网站的一个DLL文件时遇到了类似的问题。

当我简单地通过FTP将此DLL文件复制到bin文件夹时,发生了此错误。

我通过以下方式解决了此问题:

停止网站;复制所需的DLL文件/DLL文件;启动网站

我在使用内部包存储库时遇到了这个问题。我已经将主包添加到内部存储库中,但没有添加包的依赖项。确保将所有依赖项、依赖项的依赖项、递归等也添加到内部存储库中。

在AssemblyInfo.cs文件中的AssemblyVersion中,使用固定版本号,而不是指定*。*将更改每次编译的版本号。这就是我这个例外的问题所在。