无法加载system.com.ponentmodel



我在使用ServiceStack.OrmLite.Core软件包(5.4.1)时会出现运行时错误,并尝试通过:

尝试获得ModelDefinitionServiceStack.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 nne n's可用)无用。我还尝试了在遇到System.io.fileloadexception时建议的各种修复程序,但没有任何作用。

该项目是一个.NET Framework 4.7.1项目,但解决方案中包括.NET标准项目,因此我需要运行.core版本的ServicEstack.ormlite。

我已经在上述两个工作区(两台单独的机器),(1)和(2)的情况下尝试了此操作,而解决方案中没有.NET标准项目。在运行ServiceStack.OrmLite的非核心版本时,在(2)机器上可以工作,但是切换到ServiceStack.OrmLite.Core发生运行时错误。

有人有任何想法吗?

最终我弄清楚了……

事实证明ServiceStack.OrmLite.MySql.Core需要System.ComponentModel.Annotations版本4.2.0.0,因为错误消息明确指出。通常,它可以安装等于或更大的版本,但在这种情况下,这些版本均无效。出于某种原因,FX中包含的最新版本为4.0.0.0(或者至少是当我包含它的汇编版本时得到的。)也有一个Nuget安装版本4.5.0.0,但结果是相同。

我不知道为什么它使用ServiceStack.OrmLite.MySql的FX版本开箱即用,但是当我像我一样使用核心版本时,我没有找到没有以下修复的方法来避免这种情况:

在我的启动项目中,我需要添加一个汇编绑定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>

我敢肯定,那里有人可以解释有关此的细节,但我不是其中一个,而是……将其添加到启动Projects app.config会做技巧。

在试图重复此事时,我在.NET框架模板上使用ASP.NET核心应用程序解决了一个不同的问题.csproj 应引用新的ServiceStack.Kestrel.Core软件包,而不是ServiceStack.Kestrel,i,e:

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

现在在所有.Core模板中进行更新。要访问Myget上的最新v5.4.1软件包,您需要清除Nuget软件包缓存:

$ nuget locals all -clear

然后使用新的web .NET核心工具安装最新的Web-CoreFix项目:

$ dotnet tool install --global web
$ web new web-corefx WebCoreFx

然后,我在 WebCoreFx.csproj中添加了ormlite mysql的引用:

<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();
}

可以按预期运行并无问题运行。

如果您仍然有问题,您是否可以在GitHub上上传MCVE,我可以在本地运行以重复此问题。

我有这个问题,而其他与不支持的SQLCLCLIENT相关的问题。确保将常规.NET应用程序设置为使用PackageReference而不是packages.config。如果不迁移。这解决了我的问题,而不必放入一堆绑定的重定向。

最新更新