【问题标题】:Unable to reference 'FSharpOption<>' within C# project无法在 C# 项目中引用“FSharpOption<>”
【发布时间】:2026-01-23 19:40:02
【问题描述】:

我无法在 Visual Studio 2015 中针对 Xamarin.Android 的 C# PCL 项目中引用 FSharpOption&lt;&gt;

这是一个video,它显示了我尝试解决它的步骤。

我收到的错误如下:

FSharpOption&lt;&gt; 类型在未引用的程序集中定义。您必须添加对程序集的引用

FSharp.Core, Version=3.7.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

注意:

我的 C# 项目确实引用了 FSharp.Core。它引用了我的 F# 项目正在使用的相同 FSharp.Core 版本:

some_path\packages\FSharp.Core.4.0.0.1\lib\portable-net45+monoandroid10+monotouch10+xamarinios10\FSharp.Core.dll

添加应用配置

我放置在 Android 客户端项目中的 app.config 文件与我在测试项目中使用的用 F# 编写的 app.config 文件相同。

app.config 如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a"
                          culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-999.999.999.999" newVersion="4.4.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

谁能指导我在我的 C# 项目中引用 FSharp.Core 功能所需的步骤?

更新

我有另一个类在同一个 C# 项目中成功引用了 FSharp.Core:

static class Utility
{
    public static bool IsSome(this FSharpOption<string> option) => FSharpOption<string>.get_IsSome(option);
    public static bool IsNone(this FSharpOption<string> option) => FSharpOption<string>.get_IsNone(option);
}

上面的代码似乎不会导致任何编译错误。同样,此文件与我的另一个确实会导致错误的文件位于同一项目中。

导致错误的代码如下:

using Microsoft.FSharp.Core;
// . . .
if (_viewModel.FamilySummary.IsSome()) {
}

注意:
FSharp.Core 的 using 语句似乎被忽略了。

我的视图模型托管在 Visual Studio 内的 F# 项目中。

【问题讨论】:

  • 您可能已经这样做了,但您是否尝试过清理然后重建?此外,如果您可以控制 F# 代码,您可能完全可以通过使用 Option.toObj 来处理您从 C# 中使用的函数来完全避免该问题。它将string option 实例更改为string,其中None 变为null
  • 有例子说明如何使用吗?我在网上搜索了规范,找不到代码sn-p。
  • 它是 F# 4 的一部分,所以不幸的是还没有它的文档(这很荒谬)。我能找到的最接近示例的是an earlier answer of mine。这真的很简单,IMO。
  • 刚刚将一个视频链接到我的帖子,显示问题和我删除文件夹。

标签: f#


【解决方案1】:

当我遇到类似问题时,解决方案是从两个项目(C# 和 F# 一个)中卸载 FSharp.Core,然后再次安装它,但使用解决方案的 NuGet 包管理器(不是针对每个项目单独安装)。

因此,从两者中删除 FSharp.Core 后,请转到工具 > NuGet 包管理器 > 管理 NuGet 包以进行解决方案...

在那里搜索 FSharp.Core,勾选你想要添加库的所有项目并选择你想要添加的版本。

这为我解决了这个问题。

编辑:值得检查的另一件事是,任何使用 FSharp.Core 的库实际上都使用与您安装的相同的版本。

【讨论】:

  • 谢谢。不幸的是,我试过了,但仍在观察同样的问题。
  • 我认识到错误并且知道上面为我解决了它。不幸的是,我不知道为什么这为我解决了它,因此我不知道真正的原因,而只是解决某些情况的程序。如果我发现任何东西,我会调查并更新我的帖子。
  • 刚刚更新了我的帖子。但是阅读您的更新也无济于事。但是您的编辑澄清了很多。让我在这上面多花点时间。
  • 刚刚发布了一个赏金。
  • 我周末一直在处理这个问题,但无法重现该问题。会看视频。
【解决方案2】:

更改app.config 中的绑定重定向后,您可能还需要删除可执行项目文件夹下的obj 文件夹。

出于某种原因,尽管执行了干净的重建,但过时的配置文件可能会在那里徘徊并被复制到您的 bin 文件夹中。

【讨论】:

  • 感谢您的建议。我没有提到的是我删除了 bin 和 obj 文件夹并重建了解决方案。但是,我一直收到同样的错误。
  • 刚刚将一个视频链接到我的帖子,显示问题和我删除文件夹。
  • forums.xamarin.com/discussion/7278/… 末尾的帖子建议将 FSharp.Core 绑定重定向添加到 Xamarin msbuild.exe.config(另一条评论建议将其添加到 xamarin studio exe 配置)。跨度>
  • 谢谢。但是,我没有使用 Xamarin Studio。我正在使用 Visual Studio。
  • 便携式库的Application 属性页上的Target F# runtime 值是什么?
【解决方案3】:

我通过将实际的 DLL 文件添加到我的客户项目中解决了我的问题,然后让我的客户引用该 dll。

【讨论】: