2012-08-25 6 views
26

アセンブリFSharp.Data.TypeProviders 4.3.0.0からF#Type Providersを使用する場合、非常に単純なF#ライブラリで型を作成できます。私はその後、FSharp.Data.TypeProvidersアセンブリに依存せずにこれらの型を使用することができます。それはかなり甘いです!次に例を示します:C#から使用できるF#Type Providerを作成するにはどうすればよいですか?

私はTryTypeProvidersというF#ライブラリプロジェクトを作成しました。私は.fsでこれを置く:

module TryTypeProviders 
type Northwind = Microsoft.FSharp.Data.TypeProviders.ODataService

私は、C#プロジェクトからのF#ライブラリを使用することができる午前:

public static void Main() 
{ 
    var c = new TryTypeProviders.Northwind(); 
    foreach (var cust in c.Customers) 
     Console.WriteLine("Customer is: " + cust.ContactName); 
    Console.ReadKey(true); 
}

私はどのようにのいずれかの作業例を見つけることができませんでしたこのような型プロバイダを作成します。 FSharpx.TypeProvidersの型プロバイダはC#からアクセスできません。私の推測では、それらは型の削除と型の生成ではないということです。私はまだ少しあいまいだよこれはこれで、それはdefined here asです:

  1. 生成されたタイプは、タイププロバイダを使用してアセンブリに埋め込まれます実際の.NETの型である(これはどのようなタイプのプロバイダはそのラップでコード生成ツール(例えば、sqlmetal use)
  2. 消去された型は、コードのコンパイル時に他の型で表現されるシミュレーテッド型です。

MSDN tutorialに記載されているF# 3.0 Sample Packのサンプルは私のために働いていません。彼らはビルドしますが、私はそれらを使用しようとするとエラーが発生します。

open Samples.FSharp.RegexTypeProvider
type PhoneNumberRegEx = CheckedRegexProvider< @"(?<AreaCode>^\d{3})-(?<PhoneNumber>\d{3}-\d{4}$)">
open Samples.FSharp.MiniCsvProvider
type csv = MiniCsvProvider<"a.csv">

それは最後の2011年3月に発売された、私の推測では、彼らはまだ2012年

F#タイププロバイダが見えるのVisual Studioに同梱タイププロバイダの最終版を反映していないということです偉大な技術のように、私たちはそれらを構築するために必要です。どんな助けもありがとうございます。

答えて

36

標準型プロバイダー(OData、LINQからSQL、およびWSDL用)がC#と連携するのは、実際の.NET型をカバーの背後に生成する理由です。これは、生成型プロバイダと呼ばれます。実際には、標準的な方法でC#の技術を使用していた場合に呼び出されるコード生成ツールを呼び出すだけです。したがって、これらの型プロバイダは、いくつかの標準.NETツール上のラッパーに過ぎません。

新たに書かれたプロバイダのほとんどは、消去タイププロバイダと書かれています。つまり、F#コンパイラにどのメンバーを呼び出すことができるかを指示する「偽」型しか生成しませんが、コンパイラがそれらをコンパイルすると、「擬似」型が他のコードに置き換えられます。これが、C#のライブラリを使用しているときにタイプを認識できない理由です。コンパイルされたコードに実際に存在するタイプはありません。

既存のコードジェネレータをラップしていない限り、型の消去型プロバイダを書く方が簡単です。したがって、ほとんどの例はこのように記述されています。消去型のプロバイダには他の利点があります。つまり、アセンブリが大きすぎるとせずに膨大な数の "偽の"タイプを生成できます。

とにかく、生成元プロバイダの作成についてのヒントを持っている簡単なメモ"Providing Generated Types" in the MSDN tutorialがあります。しかし、私は新しいF#型のプロバイダの大半が消去と書かれていると思います。実際の.NETアセンブリ(生成された型を持つ)が必要であり、型プロバイダを構築するためのF#ヘルパによって単純化されていないことに注意してください。アセンブリのためにILを生成するか、C#/ F#コードを生成する必要がありますそれをコンパイルします(つまり、CodeDOMまたはRoslynを使用して)。

+1

CodeTypeのProvidedTypes API(http://fsharp3sample.codeplex.com/) – desco

+4

のおかげでTomasが、タイププロバイダの理解に間違いなく貢献しました。私はVS 2012で動作する生成型プロバイダを得ることができました。これを使用してF#ライブラリの型を作成し、そのライブラリをC#アプリケーションから使用することができました。すべてのコードはGitHubにあり、私は途中で学んだいくつかのことを文書化するためにブログ記事を作った:[http://blog.ctaggart.com/2012/08/how-do-i-create-f-type-プロバイダ - that.html](http://blog.ctaggart.com/2012/08/how-do-i-create-f-type-provider-that.html) –

+0

[link](http:// blendinsider。 com/technical/available-now-blend-for-visual-studio-2012-2012-08-15 /)こんにちは。 F#3.0エキスパートページ468. VS '12 Proを使用する。 VS'12ProでのFsharpx.TypePoviders.XAMLのステータスはどうですか? Expressでのみ動作しますか? ProとExpressはうまくいって、一緒に遊んでいますか? –

関連する問題