インターネットでWCFを検索していると、C#のサンプルが非常に多いですが、VB.NETのサンプルが少なかったのでアップしておきます。ソースコードはC#で記述されている諸先輩サイト様達から参考にさせて頂いてます。


まずは、ホストの実装からです。

ホスト(サーバー)の実装

インターフェース部分

ABCでいうCのコントラクトの部分になります。
<System.ServiceModel.ServiceContract>
Public Interface IMyService
   <System.ServiceModel.OperationContract>
   Function GetData(user_nm As String) As String
End Interface
WCFでやり取りするインターフェースには、ServiceContract属性をつけます。また、メソッドには、OperationContract属性をつけます。
ここでは記述していませんが、独自のクラスデータに場合は、DataContract属性をつけます。

サービス実装部分

Public Class MyService1
   Implements HellowWcfLib.IMyService
    ''' GetDataの実装部分'
    Public Function GetData(user_nm As String) As String Implements HellowWcfLib.IMyService.GetData
      Return "ようこそ、" & user_nm & "さん!WCFの世界へ"
   End Function
End Class
上記で宣言したインターフェースを継承して、メソッド内の処理を作成します。

Configファイルの作成

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="NewBinding0" />
            </basicHttpBinding>
        </bindings>
        <services>
            <!--<service name="HellowWcfService">
                <endpoint binding="netNamedPipeBinding" contract="HellowWcfLib.IMyService" />
            </service>-->
          <service name="HellowWcfService">
            <endpoint binding="netTcpBinding" contract="HellowWcfLib.IMyService" />
          </service>
        </services>
    </system.serviceModel>
</configuration>
Serviceタグ内にbinding方法とコントラクトの名前を記述しています。
今回はTCP通信の実装になります。

サービスの開始と終了

Imports System.ServiceModel
Module Program
   ''' プログラムエントリ'
   Public Sub Main()
      'Dim addr As String = "net.pipe://127.0.0.1/myservice"'
      Dim addr As String = "net.tcp://127.0.0.1:8080/myservice"

      Using serviceHost As ServiceHost = New ServiceHost(GetType(MyService1))
         '// サービス追加(型とバインディング)'
         'serviceHost.AddServiceEndpoint(GetType(HellowWcfLib.IMyService),'
         '                               New NetNamedPipeBinding(),'
         '                               addr)'
         serviceHost.AddServiceEndpoint(GetType(HellowWcfLib.IMyService),
                                        New NetTcpBinding,
                                        addr)
         '/* サービスの開始 *'
         Call serviceHost.Open()
         Console.WriteLine("WCF Service start-->" & addr)
         Console.WriteLine("サービスを終了するときは何かキーを押す")
         '/* 待ち */'
         Dim str As String = Console.ReadLine()
         '/* サービスの終了 */'
         Call serviceHost.Close()

      End Using

   End Sub

End Module
ServiceHostに実装したサービスを指定します。
そして決定したアドレスでサービスをオープンさせます。非同期で受付が開始されます。
Bindingの引数にセキュリティがありますが、クライアントと一致させておく必要があります。

次にクライアント側です。

クライアント側の実装

まず、System.ServiceModelとホストで作成したインターフェースを参照しておきます。

クライアントからホストへ接続

Imports System.ServiceModel '* 参照に追加する必要あり *'
Module Module1

   Sub Main()
      'Dim addr = "net.pipe://127.0.0.1/myservice"'
      Dim addr = "net.tcp://127.0.0.1:8080/myservice"
      'Dim factory = New ChannelFactory(Of HellowWcfLib.IMyService)(New NetNamedPipeBinding,'
      '                                                             New EndpointAddress(addr))'
      Dim factory = New ChannelFactory(Of HellowWcfLib.IMyService)(New NetTcpBinding,
                                                                   New EndpointAddress(addr))
      Dim wcfch As HellowWcfLib.IMyService = factory.CreateChannel() '/* サービス参照先を設定 *'
      Console.WriteLine("名前を入力してください。")
      Dim str As String = Console.ReadLine()
      '/* ホストへコール */'
      Dim ret As String = wcfch.GetData(str)
      Console.WriteLine("返答-->" & ret)
      Console.ReadLine()
      '/* 接続を終了する */'
      factory.Close()
   End Sub

End Module
※ エラー処理などは省いております。
ChannelFactoryで接続を作成します。あとは、ホストサービスで実装したメソッドを呼び出すだけで、プロセス間通信ができます。

実行結果

20180119_wcf_vb_sample

WCFは、サービスの実装部分に集中できるのがメリットですね。

スポンサードリンク