当同时存在可移植和不可移植类库时,NuGet如何解析引用?

当同时存在可移植和不可移植类库时,NuGet如何解析引用?,nuget,portable-class-library,Nuget,Portable Class Library,我正在研究一个可移植类库,并希望了解NuGet使用的策略,以确定是否应该使用PCL或平台特定的库(如果存在) 我构建了一个引用JSON.NET的示例项目,它支持各种平台以及一个可移植类库。以下是NuGet提供的JSON.NET: net20 网络35 网络40 sl3可湿性粉剂 sl4 sl4-windowsphone71 winrt45 便携式-net40+sl4+wp7+win8 首先,我创建了一个以Net4.0为目标的库,并使用NuGet添加了对JSON.NET的引用。它添加了对net40

我正在研究一个可移植类库,并希望了解NuGet使用的策略,以确定是否应该使用PCL或平台特定的库(如果存在)

我构建了一个引用JSON.NET的示例项目,它支持各种平台以及一个可移植类库。以下是NuGet提供的JSON.NET:

net20 网络35 网络40 sl3可湿性粉剂 sl4 sl4-windowsphone71 winrt45 便携式-net40+sl4+wp7+win8 首先,我创建了一个以Net4.0为目标的库,并使用NuGet添加了对JSON.NET的引用。它添加了对net40库的引用。好吧,我想这是因为有一个精确的目标平台匹配。然后我瞄准了Net4.0.3。仍然引用了net40版本。然后我尝试了Silverlight 5,它在非便携库中没有精确的匹配。但选择了sl4库。针对Windows Phone 8,选择了sl4-WindowsPhone 71库

因此,看起来只要目标平台有一个不可移植的兼容库,它就会被优先考虑。对于JSON.NET,只有在另一个可移植库引用PCL时,才会选择PCL。如果是这样的话,我不知道如何解决以下情况:

库A有两个版本:

网络40 便携式-net40+sl4+wp7+win8 库B引用A并有一个版本:

便携式-net40+sl4+wp7+win8 最后,库C引用了A和B,并且有一个版本:

网络40 如何为C解析对库a的引用?由于C直接引用A,它应该得到A的net40。但是由于C也引用B,B是可移植的,它还应该得到A的可移植版本。所以C必须部署库A的可移植版本和net40版本来解决其依赖性。我说得对吗


更新。我创建了几个测试项目,看起来只要库C包含对不可移植库a的直接引用,此版本的库将赢得并覆盖A的PCL版本。因此,看起来不允许出现这种情况-库不能直接引用非可移植库,如果它也间接引用它的其他可移植版本。

NuGet将使用最具体的,或者在决定要引用哪个版本的库时,可能出现的最窄匹配

库的可移植版本应与库的平台特定版本兼容。我认为这只是框架不同版本之间兼容性的更一般情况。在您的示例中,将net40和portable替换为net45和net40。在这种情况下,NuGet应该使用依赖项的.NET 4.5版本,但是如果您有另一个针对.NET 4版本编译的依赖项,那么在运行时它应该使用.NET 4.5版本

要兼容,库的不同版本应具有相同的标识名、版本号和强名称密钥(如果适用),并且应与API兼容,这意味着特定平台的库版本应该与可在该平台上运行的可移植版本具有相同的API。但是,特定平台的版本可以添加其他API