3

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

F# 库需要接受来自封装在 C# 对象中的 C# 应用程序的数据。我已将包含该对象的 C# dll 导入 F# 库,但出现以下 2 个错误:

无法解析主要引用“DataStructures”,因为它间接依赖于框架程序集“mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”,在当前目标框架中无法解析。“.NETPortable,版本=v4.0,配置文件=配置文件47”。要解决此问题,请删除引用“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,配置文件=配置文件47”。要解决此问题,请删除引用“DataStructures”或将您的应用程序重新定位到包含“System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的框架版本。

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

我可以通过强制 C# 应用程序在将其数据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# 便携式库?还是有其他方法可以解决这些兼容性问题?

编辑:我还检查了:

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

1 回答 1

3

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

根据 Tao Liu 在“F# for C# Developers”中的说法......

可移植类库项目支持来自 .NET Framework、Silverlight、.NET for Windows Store 应用程序、Windows Phone 和 Xbox 360 的程序集子集,并提供了一个 Visual Studio 模板,您可以使用该模板构建无需修改即可运行的程序集这些平台。如果你不使用可移植类库项目,则必须以单一应用类型为目标,然后为其他应用类型手动修改类库。借助可移植类库项目,您可以通过构建可在不同设备的应用程序之间共享的可移植程序集来减少开发和测试代码的时间和成本。

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

稍长一点的答案:如果您想在 WinRT 应用程序或上述任何其他情况下使用 F# 库,这F# Portable Library似乎是可行的方法。F# 可移植的真正目的是编写一次在任何地方运行的 dll,但这是有代价的。所有依赖项还必须针对 System 和 mscorlib 的相同可移植子集。因此,您使用的任何 C# dllF# Portable Library也需要采用 C# 可移植类库的形式,否则您将遇到同样的问题。

于 2013-08-07T03:34:15.933 回答