如何使用 F# 3.0 类型提供程序生成 C# 友好、.Net 4.0 兼容类型

2023-12-20

我想使用 F# 3.0 类型提供程序机制基于“弱”类型数据源生成“强”类型。在仅安装 .Net 4.0 而未安装 .Net 4.5 的环境中,必须可以从 C# 客户端访问生成的类型。如果无法兼容.Net 4.0,我们就无法在当前的大型 ERP 项目中使用类型提供程序。

到目前为止,我已经按照以下步骤成功创建了 MyGenerateTypes.dlltutorial http://msdn.microsoft.com/en-us/library/hh361034%28v=vs.110%29.aspx在 msdn(“提供生成的类型”部分)上,使用ProvidedTypeDefinition来自“ProvidedTypes-0.2.fs”,它是 F# 3.0 示例包的一部分。 (为了让它工作,我必须删除该行“File.Delete...“ 来自 ”ProvidedTypeDefinition.ConvertToGenerated...“ 方法)。

MyGenerateTypes.dll 的运行时版本为 v4.0.30319,这是可以的(.Net 4.0 的运行时)。我可以在 C#/.Net 4.0 应用程序中添加对 MyGeneeratedTypes.dll 的引用,IntelliSense 会按预期显示类型和成员。但是,当我尝试编译时,C# 编译器失败并生成“警告 MSB3258:无法解析主要引用“MyGenerateTypes”,因为它间接依赖于 .NET Framework 程序集“FSharp.Core,版本=4.3.0.0” ,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”,其版本“4.3.0.0”比当前目标框架中的版本“4.0.0.0”更高。

查看 IL Spy 可以确认 MyGeneeratedTypes.dll 确实包含对 FSharp.Core 4.3 的引用,尽管该引用完全没有必要。到目前为止,我还没有发现任何方法可以阻止 F# 编译器将此引用放入生成的程序集中。 (除此之外,我在 C# 中创建了一个纯 .Net 4.0 程序集,并将其传递给ProvidedTypeDefinition,但这没有影响)。

有谁知道 a) 如何删除引用,或者 b) 如果这只是 F# 3.0 候选版本问题,这将在最终版本中解决。

Edit

与@Brian 的对话得出了以下问题的“部分”解决方案:can编译引用具有 F# 3.0 生成类型的库的“纯 C#/.Net 4.0”客户端,但只能通过调用 .Net 4.0 C# 编译器(csc) 直接地从命令行。在 VS 2010 中或通过 MSBuild 命令行编译时它不起作用。我怀疑这是由以下行为引起的:

  1. MyGenerateTypes.dll 是在 VS 2012 中使用 F# 类型提供程序机制生成的。
  2. 在生成过程中,会自动插入对 FSharp.Core 4.3 的引用(即使不需要),而无需在依赖项的元数据中指定“SpecificVersion:true”。
  3. “.Net 4.5-free”系统上的 VS 2010 中的 C# 客户端引用 MyGeneeratedTypes.dll。
  4. 编译 C# 客户端时,MSBuild 会发现 MyGenerateTypes.dll 内对 FSharp.Core 4.3 的间接引用。
  5. 由于存在“SpecificVersion:false”的间接引用,MSBuild 会发出警告MSB3257并拒绝将直接引用 /r:"MyGeneeratedTypes.dll" 传递给 C# 编译器 (csc)。 (注意:不能以任何方式抑制 MSBuild 警告。)
  6. C# 编译器 (csc) 由 MSBuild 调用,不带 /r:"MyGeneeratedTypes.dll"。因此,它无法编译,并发出编译器错误 CS0246:“找不到类型或命名空间名称 'MyGenerateTypes' (...)”。

据我所知,我们会遇到这个问题,除非修改 F# 类型提供程序机制 a) 在生成的程序集中不需要时排除对 FSharp.Core 4.3 的引用,或者 b) 包含参考元数据“SpecificVersion:true".


只需在 C# 项目中添加对 FSharp.Core 4.3.0.0 的引用(或忽略警告)。尽管编号约定很奇怪,但 FSharp.Core 4.3.0.0 不依赖于 .Net 4.5 中的任何内容,它只依赖于 .Net 4.0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 F# 3.0 类型提供程序生成 C# 友好、.Net 4.0 兼容类型 的相关文章

随机推荐