在F#可移植库中引用C#dll时解决兼容性问题

时间:2013-08-07 01:26:37

标签: f# c#-to-f#

我在创建新项目时使用VS2012提供的标准F#Portable Library选项创建了一个F#库。该库旨在供C#程序使用。

F#库需要接受封装在C#对象中的C#app中的数据。我已将包含该对象的C#dll导入F#库,但得到以下2个错误:

  

无法解析主要参考“DataStructures”,因为   它间接依赖于框架程序集“mscorlib,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089“   这在目前的目标框架中无法解决。   ” .NETPortable,版本= V4.0,外形= Profile47" 。要解决这个问题   问题,要么删除引用“DataStructures”或重新定位您的   应用程序包含“mscorlib,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089“。

  

无法解析主要参考“DataStructures”,因为   它间接依赖于框架程序集“System,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089“   这在目前的目标框架中无法解决。   ” .NETPortable,版本= V4.0,外形= Profile47" 。要解决这个问题   问题,要么删除引用“DataStructures”或重新定位您的   应用程序到包含“System,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089“。

在查看消息时,很明显F#和C#dll中使用的mscorlibSystem之间存在版本不兼容问题。所以我天真地将F#引用切换为C#dll使用的确切引用。这暂时解决了我的错误,但是一旦我构建它,f#库的引用就会自动切换回之前的mscorlibSystem的“可移植”版本。

我可以通过强制C#app将数据转换为Tuple<'t>然后将其发送到f#dll来解决这个问题,从而摆脱了这个项目中的C#dll依赖关系,但我希望避免这些变换。

这里有一篇文章 base CLI library 'mscorlib' is binary-incompatible with the referenced F# core library表明pass explicit references to both on the command-line

有一些方法可以做到这一点是F#Portable Library吗?或者有其他解决这些兼容性问题的方法吗?

编辑:我还检查过:

  1. 这两个dll都是针对.net 4.5
  2. 这两个dll的构建选项都设置为标准的“任何cpu”设置

1 个答案:

答案 0 :(得分:3)

根据John Palmer上面的评论,我对F#Portable Library的用途进行了一些研究。

据刘涛在“F#开发C#开发者”中的说法......

  

可移植类库项目支持.NET Framework,Silverlight,.NET for Windows Store应用程序,Windows Phone和Xbox 360的程序集子集,并提供可用于构建运行的程序集的Visual Studio模板没有修改这些平台。如果您不使用可移植类库项目,则必须定位单个应用程序类型,然后手动为其他应用程序类型重写类库。使用可移植类库项目,您可以通过构建跨不同设备的应用程序共享的可移植程序集来减少开发和测试代码的时间和成本。

简短回答:基本上就是约翰帕尔默所说的。在这种情况下,请勿使用F# Portable Library。使用F# Library.这样做解决了我的所有问题。

稍微长一点的回答:如果您想在WinRT应用中使用您的F#库,或者上述任何其他情况,F# Portable Library似乎是要走的路。 F#portable真的打算在任何地方运行一次dll,但这是有代价的。所有依赖项还必须以System和mscorlib的相同可移植子集为目标。因此,您在F# Portable Library中使用的任何C#dll也需要采用C#可移植类库的形式,否则您将遇到同样的问题。