Не удается загрузить System.ComponentModel.Annotations из OrmLiteConfigExtensions (ServiceStack.OrmLite.Core) - PullRequest
0 голосов
/ 19 февраля 2019

Я получаю ошибку времени выполнения при использовании пакета ServiceStack.OrmLite.Core (5.4.1) и попытке получить ModelDefinition (ServiceStack.OrmLite.ModelDefinition), выполнив:

var model = ModelDefinition<T>.Definition;

Ошибка выглядит следующим образом:

System.IO.FileLoadException: 'Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)'

Я пытался установить nuget System.ComponentModel.Annotations (4.5.0.0, так как 4.2.0.0 недоступен), но безрезультатно.Я также попробовал различные исправления , предложенные при обнаружении System.IO.FileLoadException, но ничего не работает.

Проект является проектом .Net Framework 4.7.1, но проекты .Net Standard включены врешение, поэтому мне нужно запустить .Core версию ServiceStack.OrmLite.

Я пробовал это на двух рабочих пространствах (две отдельные машины), (1), как описано выше, и (2) где нет .NetСтандартные проекты в решении.На (2) машине он работает при работе не-Core версии ServiceStack.OrmLite, но при переключении на ServiceStack.OrmLite.Core возникает ошибка времени выполнения.

У кого-нибудь есть идеи?

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

В конце концов я понял это ...

Как оказалось ServiceStack.OrmLite.MySql.Core требует System.ComponentModel.Annotations версии 4.2.0.0, поскольку в сообщении об ошибке четко указано.Обычно это работает для установки версии, равной или большей, чем требуется, но в этом случае ничего из этого не сработало.И по какой-то причине кажется, что последний выпуск, включенный в FX, - это 4.0.0.0 (или, по крайней мере, это то, что я получаю, когда включаю его версию для сборки). Существует также установка nuget версии 4.5.0.0, но в результате получаетсято же самое.

Я понятия не имею, почему он работает «из коробки» с использованием FX-версий ServiceStack.OrmLite.MySql, но при использовании версии Core, как я, я не вижу способа избежать этого без следующего исправления:

В моем проекте запуска мне нужно добавить привязку сборки, сообщающую ServiceStack.OrmLite.MySql.Core, что System.ComponentModel.Annotations версия 4.2.0.0 «перенаправляет» на 4.0.0.0 (той же сборки).Это выглядит так:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.0.0.0" />
     </dependentAssembly>
 </assemblyBinding>

Я уверен, что есть люди, которые могут объяснить детали этого, я не один из них, но тем не менее ... добавление этого в проекты запуска app.config сделаеттрюк.

0 голосов
/ 25 марта 2019

У меня была эта проблема, а другие, связанные с SqlClient, не поддерживаются.Убедитесь, что обычное приложение .net настроено на использование PackageReference вместо packages.config.Если не перенести его.Это решило мои проблемы без необходимости связывать перенаправления связывания.

0 голосов
/ 20 февраля 2019

Пытаясь воспроизвести это, я решил другую проблему с Базовыми приложениями ASP.NET в шаблонах .NET Framework , ссылаясь на последние v5.4.1 пакеты MyGet , где Тесты .csproj должен ссылаться на новый пакет ServiceStack.Kestrel.Core вместо ServiceStack.Kestrel, i, e:

<PackageReference Include="ServiceStack.Kestrel.Core" Version="5.*" />

, который теперь обновляется во всех .Core шаблонах.Чтобы получить доступ к последним пакетам v5.4.1 на MyGet, вам необходимо очистить кеш пакетов NuGet:

$ nuget locals all -clear

Затем установить последний web-corefix проект, используя новый web.Инструмент NET Core:

$ dotnet tool install --global web

$ web new web-corefx WebCoreFx

Затем я добавил ссылку на OrmLite MySql в WebCoreFx.csproj:

<PackageReference Include="ServiceStack.OrmLite.MySql.Core" Version="5.*" />

И обновил Startup.cs для регистрациипровайдер MySql, создайте и выберите из таблицы простую таблицу и получите доступ к ее ModelDefinition<T>.Definition API:

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public override void Configure(Container container)
{
    SetConfig(new HostConfig {
        DefaultRedirectPath = "/metadata",
        DebugMode = AppSettings.Get(nameof(HostConfig.DebugMode), false)
    });

    container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(
        "Server=localhost;Database=test;UID=root;Password=test;SslMode=none",
        MySqlDialect.Provider));

    using (var db = container.Resolve<IDbConnectionFactory>().OpenDbConnection())
    {
        db.DropAndCreateTable<Person>();

        db.Insert(new Person {Id = 1, Name = "Name"});

        var s = db.Select<Person>().Dump();
        s.PrintDump();
    }

    var model = ModelDefinition<Person>.Definition;
    model.Name.Print();
}

, который работает как положено и работает без проблем.

Если у вас все еще есть проблемы, вы можете загрузить MCVE на GitHub, который я могу запустить локально, чтобы воспроизвести проблему.

...