F# 如何创建可从C使用的F类型提供程序?

F# 如何创建可从C使用的F类型提供程序?,f#,type-providers,F#,Type Providers,如果我使用程序集FSharp.Data.TypeProviders 4.3.0.0中的F#Type提供程序,我就能够在一个非常简单的F#库中创建类型。然后,我就能够使用这些类型,而不依赖于程序集FSharp.Data.TypeProviders。真是太好了!以下是一个例子: 我创建了一个名为TryTypeProviders的F#library项目。我把它放在.fs中: module TryTypeProviders type Northwind = Microsoft.FSharp.Data.T

如果我使用程序集FSharp.Data.TypeProviders 4.3.0.0中的F#Type提供程序,我就能够在一个非常简单的F#库中创建类型。然后,我就能够使用这些类型,而不依赖于程序集FSharp.Data.TypeProviders。真是太好了!以下是一个例子:

我创建了一个名为TryTypeProviders的F#library项目。我把它放在.fs中:

module TryTypeProviders
type Northwind = Microsoft.FSharp.Data.TypeProviders.ODataService
然后我可以使用C项目中的F库:

我还没有找到任何关于如何创建这样的类型提供程序的工作示例。无法从C#访问FSharpx.TypeProviders中的类型提供程序。我的猜测是,它们是被擦除的类型,而不是生成的类型。我还是有点模糊,但它是:

  • 生成的类型是嵌入到使用类型提供程序的程序集中的真实.NET类型(这是包装代码生成工具(如sqlmetal)的类型提供程序所使用的)
  • 擦除类型是模拟类型,在编译代码时由其他类型表示
  • MSDN中提到的样品不适用于我。它们可以构建,但当我尝试使用它们时,会出现错误

    open Samples.FSharp.RegexTypeProvider
    type PhoneNumberRegEx = CheckedRegexProvider< @"(?<AreaCode>^\d{3})-(?<PhoneNumber>\d{3}-\d{4}$)">
    open Samples.FSharp.RegexTypeProvider
    键入PhoneNumberRegEx=CheckedRegexProvider<@“(?^\d{3})-(?\d{3}-\d{4}$)”>
    open Samples.FSharp.MiniCsvProvider
    键入csv=MiniCsvProvider
    它上一次发布是在2011年3月,我猜它们还没有反映Visual Studio 2012附带的类型提供程序的最终版本


    F#型提供商看起来是一项伟大的技术,但我们需要帮助构建它们。感谢您的帮助。

    标准类型提供程序(对于OData、LINQ到SQL和WSDL)使用C#的原因是它们在封面后面生成真实的.NET类型。这称为生成类型提供程序。事实上,他们只是调用代码生成工具,如果您以标准方式使用C#中的这些技术,就会调用该工具。因此,这些类型提供程序只是一些标准.NET工具的包装

    大多数新编写的提供程序都被编写为擦除类型提供程序。这意味着它们只生成告诉F#编译器可以调用哪些成员的“假”类型(等等),但当编译器编译它们时,“假”类型将被其他代码替换。这就是为什么在使用C#中的库时看不到任何类型的原因——编译代码中实际上不存在任何类型

    除非包装现有的代码生成器,否则编写擦除类型提供程序更容易,因此大多数示例都是以这种方式编写的。擦除类型提供程序还有其他好处,即它们可以生成大量“伪”类型,而不会生成过大的程序集


    无论如何,这里有一个简短的说明,其中有一些关于编写生成提供者的提示。然而,我希望大多数新的F#type提供程序都被编写为擦除。它注意到,您必须拥有一个真实的.NET程序集(带有生成的类型),并且获取该程序集不会被用于构建类型提供程序的F#helpers简化,因此您需要为程序集发出IL或生成C#/F#代码并编译(即使用CodeDOM或Roslyn).

    作为生成型类型提供程序的小样本,您可以查看Codeplex()上提供的类型API的测试集,多亏了Tomas,这无疑有助于我理解类型提供程序。我能够让一个生成型提供者在VS2012中工作。我能够使用它在F#库中创建类型,并从C#应用程序中使用该库。所有的代码都在GitHub中,我在博客上写了一篇文章,记录了我在这一过程中学到的一些东西:嗨。F#3.0专家版468页。使用VS'12 Pro。VS'12Pro的Fsharpx.TypePoviders.XAML的状态如何?它只适用于快车吗?Pro和Express一起工作和玩得好吗?Lamar项目使用Roslyn在内存中编译生成的类型(请参见此处的LamarCodeGeneration和LamarCompiler:)。对于C#工具来说,这似乎是一个很好的起点。在这里的GitHub讨论中提到了这一点:。
    open Samples.FSharp.RegexTypeProvider
    type PhoneNumberRegEx = CheckedRegexProvider< @"(?<AreaCode>^\d{3})-(?<PhoneNumber>\d{3}-\d{4}$)">
    open Samples.FSharp.MiniCsvProvider
    type csv = MiniCsvProvider<"a.csv">