Visual Studio User Group

   ホーム      
 | 
  
   イベント      
 | 
  
   フォーラム      
 | 
  
   VSUG キャスト      
 | 
  
   記事      
 | 
  
   About VSUG   
会員サービス
メンバー ログイン
新規会員登録はこちら
MENU
ホーム
イベント
VSUG アカデミー
VSUG Day
Bar VSUG
過去のイベント
フォーラム
初心者フォーラム
Visual Studio
.NET 開発
プラットフォーム運用
フリートーク・お知らせ
フォーラムの利用案内
VSUG キャスト
第 1 回 近藤 和彦 氏
第 2 回 長沢 智治 氏
記事
連載
コラム
About VSUG
VSUGとは
フォーラムリーダー紹介
ガジェット
スタッフ日記
フォーラムグループ
初心者フォーラム
初心者なんでも相談室
Visual Studio
Visual Studio 2005
Visual Studio 旧環境
.NET 開発
Visual Basic
Visual C#
Visual C++/CLI その他
Web アプリケーション
リッチクライアント・UI コントロール
データベース・データアクセス
モバイル・スマートクライアント
.NET Framework
開発プロセス
マイグレーション・COM 相互運用
Office 開発・VSTO
Web ホスティングアプリケーション
ライティング・セキュアコード
プラットフォーム運用
運用管理
フリートーク・お知らせ
談話室
VSUGからのお知らせ
フォーラムの利用案内
インフォメーション
会員規約
会員登録
プライバシーポリシー
リンクポリシー
著作権について
スポンサーについて
お問い合わせ
オンライン状態
オンライン状況 オンライン状態:
未登録ユーザー 未登録ユーザー: 206
登録ユーザー 登録ユーザー: 0
計 計: 206

オンライン中のユーザー オンライン中のユーザー:

 
  VSUG フォーラム  .NET 開発  .NET Framework  WCFのDataContractについて
前へ 前へ
 
次へ 次へ
新しい投稿 2009/02/20 10:41
ユーザーはオフラインです。 mr.popo
1件の投稿
ランキングデータがありません


WCFのDataContractについて 
言語:VC++ / Ver:2008 / プラットフォーム:Windows XP

お世話になります。

現在、WCFにてプロセス間通信プログラムを作成しています。

通信上で受け渡すユーザ定義型のクラスを以下のようにDataContractで定義しています。
このユーザ定義型のフィールドにはEnumを含んでいます。

これを利用しホストサービスを起動して、SvcUtil.exeでクライアントコードを出力しましたが、
EnumがObjectとして解釈されてしまいます。

SvcUtil.exeを利用することを前提として、
Enumをクライアント側でもユーザ定義したStatusとして解釈させる事はできないのでしょうか?

EnumをDataMemberとして利用することは可能とありましたが。。
msdn.microsoft.com/ja-jp/library/aa347875%28VS.80%29.aspx
---以下、ソースです。

[DataContract]
public enum class Status
{
    [EnumMember]
    STATUS0 = 0,

    [EnumMember]
    STATUS1 = 1,

    [EnumMember]
    STATUS2 = 2
};

[DataContract]
public ref class TranceferData
{
private :
    Status^ _status;

public:
    [DataMember]
    property Status^ status
    {
        Status^ get() {
            return this->_status;
        }
        void set(Status^ status) {
            this->_status = status;
        }
    }
};

[ServiceContract(SessionMode = SessionMode::Required)]
public interface class ISampleService
{
    [OperationContract]
    TranceferData^ getStatus();
};
[ServiceBehavior(InstanceContextMode=InstanceContextMode::Single,
ConcurrencyMode=ConcurrencyMode::Reentrant)]
public ref class SampleService : public ISampleService
{
public :
    virtual TranceferData^ getStatus()
    {
        TranceferData^ data = gcnew TranceferData();
        data->status = Status::STATUS0;
        return data;
    }
};

---SvcUtil.exeで出力されたコードです。

#pragma once

#using <mscorlib.dll>
#using <System.ServiceModel.dll>
#using <System.Runtime.Serialization.dll>
#using <System.dll>

using namespace System::Security::Permissions;
[assembly:SecurityPermissionAttribute(SecurityAction::RequestMinimum, SkipVerification=false)];
namespace Service {
    ref class TranceferData;
}
interface class ISampleService;
interface class ISampleServiceChannel;
ref class SampleServiceClient;
namespace Service {
    using namespace System::Runtime::Serialization;
    using namespace System;
    ref class TranceferData;
    
    
    [System::Diagnostics::DebuggerStepThroughAttribute,
    System::CodeDom::Compiler::GeneratedCodeAttribute(L"System.Runtime.Serialization", L"3.0.0.0"),
    System::Runtime::Serialization::DataContractAttribute(Name=L"TranceferData", Namespace=L"http://schemas.datacontract.org/2004/07/Service")]
    public ref class TranceferData : public System::Object, public System::Runtime::Serialization::IExtensibleDataObject
    {
        
        private: System::Runtime::Serialization::ExtensionDataObject^  extensionDataField;
        
        private: System::Object^  statusField;
        
        public: virtual property System::Runtime::Serialization::ExtensionDataObject^  ExtensionData
        {
            System::Runtime::Serialization::ExtensionDataObject^  get() sealed;
            System::Void set(System::Runtime::Serialization::ExtensionDataObject^  value) sealed;
        }
        
        public: [System::Runtime::Serialization::DataMemberAttribute]
        property System::Object^  status
        {
            System::Object^  get();
            System::Void set(System::Object^  value);
        }
    };
}
namespace Service {
    
    
    inline System::Runtime::Serialization::ExtensionDataObject^  TranceferData::ExtensionData::get()
    {
        return this->extensionDataField;
    }
    inline System::Void TranceferData::ExtensionData::set(System::Runtime::Serialization::ExtensionDataObject^  value)
    {
        this->extensionDataField = value;
    }
    
    inline System::Object^  TranceferData::status::get()
    {
        return this->statusField;
    }
    inline System::Void TranceferData::status::set(System::Object^  value)
    {
        this->statusField = value;
    }
}
using namespace System;
interface class ISampleService;
interface class ISampleServiceChannel;
ref class SampleServiceClient;


[System::CodeDom::Compiler::GeneratedCodeAttribute(L"System.ServiceModel", L"3.0.0.0"),
System::ServiceModel::ServiceContractAttribute(ConfigurationName=L"ISampleService", SessionMode=System::ServiceModel::SessionMode::Required)]
public interface class ISampleService
{
    
    [System::ServiceModel::OperationContractAttribute(Action=L"http://tempuri.org/ISampleService/getStatus", ReplyAction=L"http://tempuri.org/ISampleService/getStatusResponse")]
    Service::TranceferData^  getStatus();
};

[System::CodeDom::Compiler::GeneratedCodeAttribute(L"System.ServiceModel", L"3.0.0.0")]
public interface class ISampleServiceChannel : public ISampleService, public System::ServiceModel::IClientChannel
{
};

[System::Diagnostics::DebuggerStepThroughAttribute,
System::CodeDom::Compiler::GeneratedCodeAttribute(L"System.ServiceModel", L"3.0.0.0")]
public ref class SampleServiceClient : public System::ServiceModel::ClientBase<ISampleService^ >, public ISampleService
{
    
    public: SampleServiceClient();
    public: SampleServiceClient(System::String^  endpointConfigurationName);
    public: SampleServiceClient(System::String^  endpointConfigurationName, System::String^  remoteAddress);
    public: SampleServiceClient(System::String^  endpointConfigurationName, System::ServiceModel::EndpointAddress^  remoteAddress);
    public: SampleServiceClient(System::ServiceModel::Channels::Binding^  binding, System::ServiceModel::EndpointAddress^  remoteAddress);
    public: virtual Service::TranceferData^  getStatus() sealed;
};





inline SampleServiceClient::SampleServiceClient()
{
}

inline SampleServiceClient::SampleServiceClient(System::String^  endpointConfigurationName) :
        System::ServiceModel::ClientBase<ISampleService^ >(endpointConfigurationName)
{
}

inline SampleServiceClient::SampleServiceClient(System::String^  endpointConfigurationName, System::String^  remoteAddress) :
        System::ServiceModel::ClientBase<ISampleService^ >(endpointConfigurationName, remoteAddress)
{
}

inline SampleServiceClient::SampleServiceClient(System::String^  endpointConfigurationName, System::ServiceModel::EndpointAddress^  remoteAddress) :
        System::ServiceModel::ClientBase<ISampleService^ >(endpointConfigurationName, remoteAddress)
{
}

inline SampleServiceClient::SampleServiceClient(System::ServiceModel::Channels::Binding^  binding, System::ServiceModel::EndpointAddress^  remoteAddress) :
        System::ServiceModel::ClientBase<ISampleService^ >(binding, remoteAddress)
{
}

inline Service::TranceferData^  SampleServiceClient::getStatus()
{
    return __super::Channel->getStatus();
}

 
新しい投稿 2009/04/16 23:04
ユーザーはオフラインです。 handcraft
13件の投稿
ランキングデータがありません


Re: WCFのDataContractについて 

こんにちは

参考になるかわかりませんが、

C#のWCFサービスライブラリプロジェクトでenum型をメンバーとしてもつクラスを作成し、ビルドして作成されたdllからsvcutil.exeを使用してcpp用のプロキシを作成しましたがちゃんとenum型(public enum で定義)に解釈されました。

サービスコントラクトが定義されたexeやdllから直接wsdlを作成し、プロキシクラスを作成してもObjectとなってしまうのでしょうか。


handcraftの備忘録
 
 1/1ページ
前へ 前へ
 
次へ 次へ
  VSUG フォーラム  .NET 開発  .NET Framework  WCFのDataContractについて
ログイン | © Visual Studio User Group. All rights reserved. 著作権について | プライバシーポリシー | リンクポリシー | お問合せ