无法加载文件或程序集 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.x
是System.Runtime.CompilerServices.Unsafe
nuget 包版本,而4.0.x.x
是System.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 包时选择的 包 版本不同。它们对应如下:
在这个绑定重定向中,我使用了更新版本的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”