3

私は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#に忍び込み、同時に学習するという目的に反しています;-)

4

2 に答える 2

3

WSDLタイププロバイダー(および他のいくつか)は、バックグラウンドでSvcUtilを使用して手間のかかる作業を行っています。taskmgrまたは同様のツールのProcExpを開くと、TPコードをVisualStudioに貼り付けた後にSvcUtilプロセスが生成されるのを確認できます。少なくともProcExpを使用すると、使用された引数を含む完全なコマンドラインを確認できます。

したがって、サービスのTPによって呼び出されたSvcUtilコマンドラインを正確に調べ、F#環境の外部で機能するかどうかを確認します。

SvcUtilがC#/VS2010から機能するという事実は興味深いものです。F#TPを使用している場合は、現在VS2012を使用していると思います。その場合、SvcUtil自体のバージョンが異なる可能性があり、これは関連している可能性があります。

特定のエラーはここで説明したものと同じように見えるため、サービスコードに不完全なアノテーションが含まれている可能性があります。

于 2012-10-19T16:16:19.193 に答える
0

私はこの問題を残すことができません...

私は今、次のことをしました:

  1. プレーンバニラ設定でsvcutilを実行します:svcutil http://some.address/some/path.svc
  2. さらに設定を加えて実行します:svcutil / r: "C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5 \ System.dll" / r: "C:\ Program Files(x86)\参照アセンブリ\Microsoft\ Framework.NETFramework \ v4.5 \ System.Data.dll " http://some.address/some/path.svc

これにより、C#ファイルに次のような違いが生じます(1)には存在し、2)には存在しません)。

namespace System.ComponentModel
{
    using System;


    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.SerializableAttribute()]
    public partial class PropertyChangedEventHandler : System.MulticastDelegate
    {

        public PropertyChangedEventHandler(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : 
                base(info, context)
        {
        }
    }
}
namespace System.Data
{
    using System;
    using System.Runtime.Serialization;


    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.FlagsAttribute()]
    [System.Runtime.Serialization.DataContractAttribute(Name="DataRowState", Namespace="http://schemas.datacontract.org/2004/07/System.Data")]
    public enum DataRowState : int
    {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Detached = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Unchanged = 2,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Added = 4,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Deleted = 8,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Modified = 16,
    }
}

これにより、ファイルは2)でコンパイルされ、それ以外の場合は予想どおりになります。

やや奇妙な部分は次のとおりです。svcutilを実行しているときにF#wsdlプロバイダーでSystem.dllが使用されないのはなぜですか?System.Data.dll svcutilを実行するときにデフォルトで使用されないので、私はある程度理解しています(少なくともドキュメントによると)。

OTOHまた、ドキュメントには、アセンブリがGACにある場合は、それらを使用する必要があると記載されていると思います。では、それらが存在することを確認したり、存在しない場合はアセンブリにロードしたりするにはどうすればよいですか?

gacutil -i System.dll(System.dllのバージョン4.5)を実行すると、次のようになります。

キャッシュへのアセンブリの追加に失敗しました:誤った形式のプログラムをロードしようとしました。

64/32ビットの問題ですか?(関連性がある場合は、64ビットウィンドウを使用しています)

または、問題を言い換えると、WsdlProvider-partを介して直接参照を追加できない場合に、svcutilを実行しているときにSystem.dllとSystem.Data.dllを参照の一部にするにはどうすればよいですか?

collectiontype paramをwsdlproviderに追加すると、System.dllが使用されないことは間違いありません。

WsdlService<"http://some.url/some/path.svc", "c:\\temp\\wsdl\\some.wsdlschema", true, ".", true, true, false, false, "System.Collections.Generic.List'1">

また、次のように文句を言います。

タイププロバイダー'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'がエラーを報告しました:エラー:/collectionTypeオプションに渡された値System.Collections.Generic.List'1のタイプをロードできませんでした。このタイプが属するアセンブリが/referenceオプションで指定されていることを確認してください。

System.dllが参照されていれば、これは直接利用できるはずでした(私は思います)。

この問題をさらに調査または解決するためのアイデアはありますか?

于 2012-10-29T12:30:16.720 に答える