1

System.Versionを返すWCF操作MyGetVersion()があります。Silverlightサービス参照からの呼び出しをデバッグするときに、サービスが正しいSystem.Versionオブジェクトを返すことを確認しました。サービスリファレンスでは、自動生成されたメソッドは次のとおりです。

       public System.Version EndMyGetVersion(System.IAsyncResult result) {
            object[] _args = new object[0];
            System.Version _result = ((System.Version)(base.EndInvoke("MyGetVersion", _args, result)));
            return _result;
        }

例外を発生させます:

メソッド'DynamicClass.ReadVersionFromXml(System.Runtime.Serialization.XmlReaderDelegator、System.Runtime.Serialization.XmlObjectSerializerReadContext、System.Xml.XmlDictionaryString [])'でメソッド'System.Version。にアクセスしようとしました。 ctor()'が失敗しました。

これを確認するには、「CLR例外の中断」ヘルパーをオンにする必要がありました。それ以外の場合は、TargetInvocationExceptionです。System.Version()コンストラクターは、私が知る限り公開されています。私は何が間違っているのですか?

4

1 に答える 1

1

問題は、System.Versionのコンストラクターが.NET Frameworkで公開されているが、Silverlightでは公開されていないことです(Reflectorによると内部です)。したがって、この型は完全なフレームワークでシリアル化できますが、Silverlightにはありません。また、サービス参照の追加ツールでSLの同等の型に置き換える必要があります。これはツールのバグです(製品チームに報告します)。 、それを見つけてくれてありがとう)。

回避策として、バージョンに「代理」タイプを使用し、データ転送のみのサービス契約で使用することをお勧めします。

[DataContract]
public class VersionDTO
{
    [DataMember]
    public int Major { get; set; }
    [DataMember]
    public int Minor { get; set; }
    [DataMember]
    public int Build { get; set; }
    [DataMember]
    public int Revision { get; set; }

    public VersionDTO(Version version) {
        this.Major = version.Major;
        this.Minor = version.Minor;
        this.Build = version.Build;
        this.Revision = version.Revision;
    }
}

[ServiceContract]
public interface ITest
{
    [OperationContract]
    VersionDTO GetVersion();
}

コメントで言及した問題を考慮した別のオプションは、Silverlight用に生成されたプロキシのVersionクラスへの参照を、それと同等のクラスに置き換えることです。以下のクラスを使用して、SLのVersionオブジェクトを.NETから逆シリアル化できます。

    [DataContract(Name = "Version", Namespace = "http://schemas.datacontract.org/2004/07/System")]
    public class SLVersion
    {
        [DataMember(Order = 1, Name = "_Build")]
        public int Build { get; set; }
        [DataMember(Order = 2, Name = "_Major")]
        public int Major { get; set; }
        [DataMember(Order = 3, Name = "_Minor")]
        public int Minor { get; set; }
        [DataMember(Order = 4, Name = "_Revision")]
        public int Revision { get; set; }
    }
于 2011-07-20T20:27:32.957 に答える