私はF#タイププロバイダーのアイデアが大好きですが、それらを使用する最初の真剣な試みは激しくクラッシュしました。
サービス(WCF)に接続するつもりでしたWsdlService<"http://someurl/some.svc?wsdl">
それは壮大に失敗します:
タイププロバイダー'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'がエラーを報告しました:tmp6E6C.cs(9409,26):エラーCS0644:'System.ComponentModel.PropertyChangedEventHandler'は特別なクラス'System.MulticastDelegate'から派生できませんc :\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ mscorlib.dll :(前のエラーに関連するシンボルの場所)
おそらく関係のない他の多くの警告:
tmp6E6C.cs(290,28):警告CS0436:'c:\ Users \ someuser \ AppData \ Local \ Temp \tmp6E6C.cs'のタイプ'System.Data.DataRowState'は、インポートされたタイプ'System.Dataと競合します。 'c:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319\System.Data.dll'のDataRowState'。'c:\ Users \ someuser \ AppData \ Local \ Temp\tmp6E6C.cs'で定義されたタイプを使用します。tmp6E6C.cs(9427,17):(前の警告に関連する記号の場所)
これは既知の機能ですか;-)または間違って使用していますか?
残念ながら、WSDLを投稿することはできません。また、WSDLはかなり大きく、多くのタイプが含まれているため、多少怠惰であり、トリミングもしていないことを認める必要があります。OTOH WSDLのどの部分が問題を起こしているか、またはこのエラーを作成しているのかを知っていれば、もちろんここに配置します。
WSDLを変更することもオプションではないため、F#WSDLタイププロバイダーがこの(WCF)WSDLを処理できない理由、または私が間違っていることを知ることに主に関心があります。
VS2010のC#およびsvcutil.exeで使用すると、優れた動作をします。
WsdlTypeProviderに対してすべてのパラメーターを試しましたが、同じ結果が得られます(もちろん、ForceUpdateを除く)。F#を使用してこれらのサービスを別の方法で利用する必要がありますか?
================================================== =============================情報を追加しました(私は新しく、答えたくなかったので。理由を聞かないでください:):
回答・コメントありがとうございます。
私は部分的にこのように行ったかもしれません(手動でsvcutilを使用して)。上で述べたように、svcutilを手動で使用しようとしましたが、生成されたC#コード(F#以外のライブラリ内)をコンパイルすると失敗します。
つまり、私は次のことを行いました。
1)VS 2010 GUIで参照を設定して、コントラクトを作成します。これは期待どおりに機能します
2)cmd-lineからsvcutilを使用して作成してみてください。その後、そのファイルのコンパイルは同じエラーで失敗します。
私の見解では、cmd-lineからsvcutilで何が起こり、GUIからsvcutil(または使用されるもの)を使用すると何が起こるかは、同じサービスを追加しても同じパラメーターを持つコードを生成しません。これは、私が消費しようとしているのは「クリーンな」WSDL / WebサービスではなくWCFサービスであり、タイププロバイダーは「クリーンな」Webサービスを使用しようとしていると想定しているという事実によって部分的に制御されていると思います。
私はこれを処理するsvcutilのパラメータ、またはパラメータの可能な組み合わせを見つけることができませんでした。組み合わせのすべての順列を試したとは言えませんが、svcutilのドキュメントを深く読んだことに基づいて(しようとした)可能性のあるものを試しました(そして、私はcmd-lineからそれを使用することにまったく新しいわけではありません)。
これまでのところ、これを引き起こすのはsvcutilの「欠落している」パラメーターであり、F#タイププロバイダーに問題はないと結論付けています。F#タイプのプロバイダーを使用して、なんとかして解決したいと思いますが、フォールバックは、C#でGUIを使用してコードを生成し、F#でコードのその部分を再度参照することです。私はたくさんのサービスを持っているので、それは私が達成しようとしていたエレガントなソリューションではありません。私はそれらのサービスのプロトタイピングとテストのこのような素晴らしい方法を作成したいと思っています。
もちろん、別のフォールバックもF#の部分全体を放棄し、単体テストなどを行うだけですが、これもF#に忍び込み、同時に学習するという目的に反しています;-)