Не удалось загрузить файл или сборку System.Runtime.CompilerServices.Unsafe
Пишу проект в Visual Studio (Community 2019) на C# с использованием ServiceStack.Redis. Поскольку C#, сижу на Win 10 (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]; возникает исключение:
System.IO.FileLoadException: "Не удалось загрузить файл или сборку "System.Runtime.CompilerServices.Unsafe, Version=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
Ответы (1 шт):
Получил ответ на англоязычном stackoverflow:
Не удалось загрузить файл или сборку "System.Runtime.CompilerServices.Unsafe
Похоже,что вы установили пакет nuget System.Runtime.CompilerServices.Unsafe версии 4.5.3. И это соответствует сборке System.Runtime.CompilerServices.Unsafe версии 4.0.4.1.
Предложения
Попробуйте попробуйте зарегистрировать System.Runtime.CompilerServices.Unsafe версиb 4.0.4.1 в GAC.
Запустите командную строку разработчика для VS2019 от имени Администратора
введите:
cd xxxxx (путь к System.Runtime.CompilerServices.Unsafe 4.0.4.1, это в bin/debug вашего проекта) gacutil /i System.Runtime.CompilerServices.Unsafe.dll
(Этот вариант мне помог, поэтому второй вариант я не пробовал)
Если вы используете проект Net Framework с файлом xxx.config, можно использовать bindingRedirect. Добавьте в файл
app.configилиweb.configследующее:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe"
publicKeyToken="32ab4ba45e0a69a1"
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 до новой версии, вы также поменяете версию сборки bindingRedirect.
4.5.x - это версия пакета nuget System.Runtime.CompilerServices.Unsafe, а 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
P.S. В другом ответе также была приведена эта ссылка на обсуждение (и решение) этой проблемы на github.