无法加载文件或程序集 System.Runtime.CompilerServices.Unsafe

Posted

技术标签:

【中文标题】无法加载文件或程序集 System.Runtime.CompilerServices.Unsafe【英文标题】:Could not load file or assembly System.Runtime.CompilerServices.Unsafe 【发布时间】:2020-10-27 02:10:02 【问题描述】:

我使用 ServiceStack.Redis 使用 C# 创建了一个 Visual Studio (Community 2019) 项目。因为它是 C#,所以我使用 Windows 10(有一个适用于 Windows 的 Redis 版本,但它真的很旧,而且据我所知,它是非官方的,所以我担心这可能是问题所在)。 这是我的代码的摘录:

public class PeopleStorage: IDisposable

    public PeopleStorage()
    
        redisManager = new RedisManagerPool("localhost");
        redis = (RedisClient)redisManager.GetClient();
        facts = (RedisTypedClient<List<Fact>>)redis.As<List<Fact>>();
    

    public List<Fact> GetFacts(int id)
    
        string sid = id.ToString();
        if (facts.ContainsKey(sid))
            return facts[sid];
        return accessor.GetFacts(id);
    

    private RedisTypedClient<List<Fact>> facts;
    private RedisClient redis;
    private RedisManagerPool redisManager;

尝试在return facts[sid]; 行连接Redis,出现异常:

System.IO.FileLoadException:“无法加载文件或程序集 “System.Runtime.CompilerServices.Unsafe,版本=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 或其中之一 依赖。找到的程序集的清单定义不匹配 大会参考。 (HRESULT 异常:0x80131040)”

(我翻译的可能不准确)

我已尝试更新所有包,从 ServiceStack 包开始,以 System.Runtime.CompilerServices.Unsafe 本身结束。而且,在 NuGet 中不能选择 4.0.4.1 版本,最接近的是 4.0.0,而相关的是 4.0.7。

我不明白为什么它使用这个版本以及如何解决这个问题。 即使是彻底重新安装 Visual Studio 也无济于事。

【问题讨论】:

你用的是哪个版本的ServiceStack.Redis 你用的是net framework控制台项目还是net core控制台项目? 【参考方案1】:

无法加载文件或程序集 System.Runtime.CompilerServices.Unsafe

看来你已经安装了System.Runtime.CompilerServices.Unsafenuget包4.5.3版本。并且对应System.Runtime.CompilerServices.Unsafe.dll汇编版4.0.4.1

建议

1)请尝试将System.Runtime.CompilerServices.Unsafe版本4.0.4.1注册到GAC,以便系统可以注册。

管理员身份运行VS2019的开发者命令提示符

类型:

cd xxxxx (the path of the the System.Runtime.CompilerServices.Unsafe 4.0.4.1)

gacutil /i System.Runtime.CompilerServices.Unsafe.dll

2) 如果您使用带有xxx.config 文件的Net Framework 项目,您可以使用bindingRedirect。

将这些添加到app.config 文件或web.config 文件中:

<configuration>  
   <runtime>  
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
         <dependentAssembly>  
            <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe"  
                              publicKeyToken="b03f5f7f11d50a3a"  
                              culture="neutral" />  
            <bindingRedirect oldVersion="0.0.0.0-4.0.4.1"  
                             newVersion="4.0.4.1"/>  
         </dependentAssembly>  
      </assemblyBinding>  
   </runtime>  
</configuration> 

此外,如果您将System.Runtime.CompilerServices.Unsafe nuget 包版本更新为较新版本,您还应该更改bindingRedirect 程序集版本。

你可以参考System.Runtime.CompilerServices.Unsafe的这些汇编版本

4.5.xSystem.Runtime.CompilerServices.Unsafe nuget 包版本,而4.0.x.xSystem.Runtime.CompilerServices.Unsafe.dll 程序集版本。

4.5.0 is 4.0.4.0 
4.5.1 is 4.0.4.0 
4.5.2 is 4.0.4.0 
4.5.3 is 4.0.4.1
4.6.0 is 4.0.5.0
4.7.0 is 4.0.6.0
4.7.1 is 4.0.6.1
5.0.0 is 5.0.0.0

【讨论】:

所以我不太明白你的解释,因为我尝试使用 4.0.7 和 4.5.3 包,但你的第一个建议有效,谢谢!虽然现在我不能尝试第二个... P.S.还需要 2 分来支持这个答案:( #1 建议也对我有用。我想知道为什么它必须缓存在我的另一台笔记本电脑上,因为我的主笔记本电脑一切正常。 4.7.0 是 4.0.6.0,你在哪里找到这个映射?有没有一个个下载,用dnSpy之类的工具检查一下? 谢谢,解决方案 2 对我有用,但我认为你的 sn-p 有错误。应该是 publicKeyToken="b03f5f7f11d50a3a" 如何找到汇编版本?【参考方案2】:

我假设您使用的是 .NET Framework。此错误以ServiceStack.Redis 为人所知,为tracked on GitHub。这是因为您使用的库依赖于System.Runtime.CompilerServices.Unsafe不同版本。需要解决和合并这些传递依赖项,以在您的输出文件夹中生成一个程序集。您最终将获得这些版本中的最新版本。因此,如果其中一个库依赖于较旧的特定版本,则将找不到它。

导致此问题的错误已在 System.Runtime.CompilerServices.Unsafe 4.6.0 中修复。使用binding redirects,加载您需要的特定版本的程序集。将此 sn-p 插入到您的所有 app.config 文件中。

<dependentAssembly>
    <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>

您需要将所需程序集的程序集 版本指定为newVersion。这与您在安装 NuGet 包时选择的 版本不同。它们对应如下:

包 4.5.3 包含程序集版本是 4.0.4.1 包 4.7.0 包含程序集版本 4.0.6.0

在这个绑定重定向中,我使用了更新版本的System.Runtime.CompilerServices.Unsafe 来修复错误。但是,如果您依赖旧版本,请使用4.0.4.1

【讨论】:

正如我在其他地方发布的那样。这些不是我在相应的 niget 包中看到的 .dll 版本...【参考方案3】:

根据 Perry 的回答,我简单地安装了 System.Runtime.CompilerServices.Unsafe 版本 4.5.3 的 nuget 包,问题就解决了。

【讨论】:

【参考方案4】:

最近我遇到了完全相同的错误消息。但是,该消息并未出现在我用来测试我的应用程序的所有 PC 中。有些 PC 产生了错误消息,但有些则没有。我无法区分哪些是 PC 的特性会生成错误消息,哪些没有。看起来……随机的。

然后我在编译我的应用程序时注意到一条警告消息(当时我使用的是 Visual Studio 2019):

严重性代码描述项目文件行抑制状态 警告 发现同一依赖程序集的不同版本之间存在冲突。 请在项目文件中将“AutoGenerateBindingRedirects”属性设置为 true。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=294190。 SQL在线考试系统

我完全按照它告诉我的去做:

那么问题就解决了。

【讨论】:

【参考方案5】:

删除“bin”和“obj”文件夹解决了我的问题。

【讨论】:

【参考方案6】:

根据我的经验,我不需要安装 System.Runtime.CompilerServices.Unsafe,因为它是从另一个包 npgsql 引用的。 相反,我所做的如下:

    将此代码 sn-p 插入到项目的 app.config 中
 <configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="4.1.4.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    再次运行项目

这是我目前找到的解决方案,添加dependentAssembly bindingReference

【讨论】:

以上是关于无法加载文件或程序集 System.Runtime.CompilerServices.Unsafe的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集 System.Runtime.CompilerServices.Unsafe

Visual Studio 2017 - 无法加载文件或程序集“System.Runtime,Version=4.1.0.0”或其依赖项之一

无法在Visual Studio Web Api项目上加载System.runtime dll

部署 Azure 函数时无法从程序集“System.Runtime”加载类型“System.IO.Path”

能加载文件或程序集“Aspose.Cells”或它的某一个依赖项。无法验证强名称签名

无法加载文件或程序集,但已加载