10

F#3.0タイププロバイダーメカニズムを使用して、「弱い」型のデータソースに基づいて「強い」型を生成したいと思います。生成されたタイプは、.Net 4.0のみがインストールされ、.Net 4.5はインストールされていない環境のC#クライアントからアクセスできる必要があります。.Net 4.0との互換性がない場合、現在の大規模ERPプロジェクトでタイププロバイダーを使用することはできません。

これまでのところ、F#3.0サンプルパックの一部である「ProvidedTypes-0.2.fs」から使用して、msdnのチュートリアル(「生成されたタイプの提供」のセクション)に従ってMyGeneratedTypes.dllを作成することに成功しました。(これを機能させるには、「 ...」メソッドからProvidedTypeDefinition「...」という行を削除する必要がありました)。File.DeleteProvidedTypeDefinition.ConvertToGenerated

MyGeneratedTypes.dllのランタイムバージョンはv4.0.30319で、問題ありません(.Net 4.0のランタイム)。C#/。Net 4.0アプリケーションでMyGeneratedTypes.dllへの参照を追加すると、IntelliSenseによってタイプとメンバーが期待どおりに表示されます。ただし、コンパイルしようとすると、C#コンパイラが失敗し、警告MSB3258が生成されます。プライマリリファレンス「MyGeneratedTypes」は、.NET Frameworkアセンブリ「FSharp.Core、Version = 4.3.0.0」に間接的に依存しているため、解決できませんでした。 、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a "。これは、現在のターゲットフレームワークのバージョン"4.0.0.0"よりも高いバージョン"4.3.0.0"を持っています。

IL Spyを見ると、MyGeneratedTypes.dllにFSharp.Core 4.3への参照が含まれていることがわかりますが、この参照は完全に不要です。これまでのところ、F#コンパイラがこの参照を生成されたアセンブリに配置するのを防ぐ方法は見つかりませんでした。(特に、C#で純粋な.Net 4.0アセンブリを作成し、それをのコンストラクターに渡しましたProvidedTypeDefinitionが、これは影響しません)。

誰かがa)参照を取り除く方法、またはb)これがF#3.0リリース候補の問題であり、最終リリースで解決されるかどうかを知っていますか。

編集

@Brianとの会話の結果、この問題に対する次の「部分的な」解決策が得られました。F#3.0で生成された型のライブラリを参照する「純粋なC#/。Net 4.0」クライアントをコンパイルできますが、.Net 4.0 C#コンパイラを呼び出す必要があります。 (csc )コマンドラインから直接。VS2010またはMSBuildコマンドラインでコンパイルする場合は機能しません。これは次の動作が原因であると思われます。

  1. MyGeneratedTypes.dllは、VS 2012でF#タイププロバイダーメカニズムを使用して生成されます。
  2. 生成中に、依存関係のメタデータで「SpecificVersion:true」を指定せずに、FSharp.Core 4.3への参照が自動的に挿入されます(不要な場合でも)。
  3. 「.Net4.5フリー」システム上のVS2010のAC#クライアントは、MyGeneratedTypes.dllを参照します。
  4. C#クライアントがコンパイルされると、MSBuildはMyGeneratedTypes.dll内のFSharp.Core4.3への間接参照を検出します。
  5. 間接参照は"SpecificVersion:false"で存在するため、MSBuildは警告MSB3257を発行し、直接参照/r:"MyGeneratedTypes.dll"をC#コンパイラ(csc)に渡すことを拒否します。(注:MSBuildの警告はいかなる方法でも抑制できません。)
  6. C#コンパイラ(csc)は、/ r:"MyGeneratedTypes.dll"なしでMSBuildによって呼び出されます。したがって、コンパイルできず、コンパイラエラーCS0246を発行します:「タイプまたは名前空間名'MyGeneratedTypes'が見つかりませんでした(...)」。

私の知る限り、F#タイププロバイダーメカニズムがa)生成されたアセンブリで必要ないときにFSharp.Core 4.3への参照を除外するか、b)を含めるように変更されない限り、この問題は解決しません。メタデータ""を含むref SpecificVersion:true

4

1 に答える 1

6

C# プロジェクトに FSharp.Core 4.3.0.0 への参照を追加するだけです (または警告を無視します)。奇妙な番号付け規則にもかかわらず、FSharp.Core 4.3.0.0 は .Net 4.5 の何にも依存せず、.Net 4.0 のみに依存します。

于 2012-06-20T18:22:19.123 に答える