我们有一个由.net Framework(4.7.2)和.net Standard(2.0)项目组成的解决方案。根据此页面:http://docs.servicestack.net/templates-corefx#reference-core-packages,我们应该仅引用.Core软件包。 在这种情况下,我们需要ServiceStack.OrmLite和ServiceStack.OrmLite.Mysql,因此我安装了ServiceStack.OrmLite.Core和ServiceStack.OrmLite.Mysql.Core。两者都使用相同的5.4.0版本。
但是,这样做时,VS(分别是2017年和2019年p3)会给我带来编译错误,指出(除其他外,我认为所有这些都归结为同一问题):
类型'IOrmLiteDialectProvider'在'ServiceStack.OrmLite,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = null'和'ServiceStack.OrmLite,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = 02c12cbda47e6587'中都存在
我们在这里看到的是,其中一个软件包的密钥为PublicKeyToken = null,而另一个软件包的密钥为02c12cbda47e6587。这可能是我问题的根源,我是否误解了应该使用的nuget版本,还是5.4.0版本中的这两个软件包不兼容?
(如果我将OrmLite.Mysql.Core版本5.2.0与OrmLite 5.4.0一起安装,则该项目可以编译,但由于它们引用的是Mysql的不同版本,因此在运行时将失败。)
最后,至少有人知道为什么.net标准软件包被称为“核心”。对我来说,了解核心软件包可以在我的.net Framework项目中使用令人困惑,因为.net Core和.net Framework项目不兼容,而.net Core和.net Framework(当然)都可以使用.net Standard。
答案 0 :(得分:0)
此异常表明您有一个项目试图同时引用同一项目中的ServiceStack.OrmLite
和ServiceStack.OrmLite.Core
程序包,而您从不应该这样做。
请仔细阅读此existing answer,.Core
包仅在尝试进行Run ASP.NET Core Apps on the .NET Framework时被引用,但是您绝对不能拥有同时引用两个.Core
的项目和非.Core软件包一起使用,您可以在不同平台之间共享依赖项的唯一方法是多目标。
您可以从以下位置找到共享常见的多目标项目的解决方案示例:
https://github.com/ServiceStackApps/HelloMobile#servicestack-server-app
这显示了一个示例,该示例显示了多主机如何通过多目标共享相同的Server.Common和ServiceModel.csproj项目:
<PropertyGroup>
<TargetFrameworks>net46;netstandard2.0</TargetFrameworks>
<RootNamespace>Server</RootNamespace>
</PropertyGroup>
.NET Core和ASP.NET Core on .NET Framework将最终使用公共项目的netstandard2.0
构建版本,而classic ASP.NET和HttpListener主机最终将使用net46
构建。