无法从OrmLiteConfigExtensions(ServiceStack.OrmLite.Core)中加载System.ComponentModel.Annotation

时间:2019-02-19 09:35:42

标签: c# .net .net-core servicestack ormlite-servicestack

使用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.2.0.0,因此无法安装4.5.0.0)。 遇到System.IO.FileLoadException时,我也尝试了various fixes的建议,但没有任何效果。

该项目是.Net Framework 4.7.1项目,但解决方案中包括.Net Standard项目,因此我需要运行ServiceStack.OrmLite的.Core版本。

我已经在两个工作区(两台独立的机器)上进行了尝试,如上所述(1)和(2)解决方案中没有.Net Standard项目的地方。 在(2)机器上,它在运行ServiceStack.OrmLite的非Core版本时可以工作,但是切换到ServiceStack.OrmLite.Core时会发生运行时错误。

有人有什么想法吗?

3 个答案:

答案 0 :(得分:2)

最终我发现了……

结果事实证明,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版本可以立即使用它,但是当像我一样使用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中可以解决问题。

答案 1 :(得分:1)

在尝试对此进行再现时,我已经解决了一个不同的问题,ASP.NET Core Apps on the .NET Framework templates引用了最新的v5.4.1 MyGet packages,其中 Tests .csproj 应该引用了新的{{1 }}软件包,而不是ServiceStack.Kestrel.Core,即:

ServiceStack.Kestrel

现在所有<PackageReference Include="ServiceStack.Kestrel.Core" Version="5.*" /> 模板中的哪个都已更新。要访问MyGet上最新的v5.4.1软件包,您需要清除NuGet软件包缓存:

.Core

然后使用新的$ nuget locals all -clear .NET Core工具安装最新的web-corefix项目:

web

然后我在$ dotnet tool install --global web $ web new web-corefx WebCoreFx 中添加了对OrmLite MySql的引用:

WebCoreFx.csproj

并更新了Startup.cs,以注册MySql提供程序,创建表并从中选择简单表并访问其<PackageReference Include="ServiceStack.OrmLite.MySql.Core" Version="5.*" /> API:

ModelDefinition<T>.Definition

可以正常工作,并且运行正常。

如果仍然有问题,您可以在GitHub上上传MCVE,我可以在本地运行以重现该问题。

答案 2 :(得分:0)

我遇到了此问题,不支持与SqlClient相关的其他问题。确保将常规.net应用设置为使用PackageReference而不是packages.config。如果不迁移的话。这样就解决了我的问题,而不必进行一堆绑定重定向。