[VB.NET]remoting客户和服务器共享成员或接口的示例

  1. 在.NET下的remoting使用里面,很多的书上都是使用了客户和服务器端都是使用一样共享成员或接口的示例来做说明。而且在实际的使用中有不小的问题。
  2. [共享代码]
  3. share.vb
  4. ImportsSystem.windows.forms
  5. PublicInterfaceIconnect'客户端和服务器端同时共享使用一个接口
  6. FunctiongetName()AsString
  7. EndInterface
  8. PublicClassapp
  9. PublicSharedReadOnlyPropertyappPath()AsString'提供一些应用程序常用路径将会在服务安装的Get'过程中被使用
  10. ReturnApplication.StartupPath
  11. EndGet
  12. EndProperty
  13. PublicSharedReadOnlyPropertywinPath()AsString
  14. Get
  15. ReturnSystem.Environment.GetEnvironmentVariable("windir")
  16. EndGet
  17. EndProperty
  18. EndClass
  19. [服务器端]'共俩个文件,第一个是服务文件,第二个是服务调用的功能实现文件
  20. service1.vb'引用了System.Runtime.Remoting.dll文件,这是服务
  21. ImportsSystem.ServiceProcess
  22. ImportsSystem.Runtime
  23. ImportsSystem.Runtime.Remoting
  24. ImportsSystem.Runtime.Remoting.Channels
  25. PublicClassService1
  26. InheritsSystem.ServiceProcess.ServiceBase
  27. #Region"组件设计器生成的代码"
  28. PublicSubNew()
  29. MyBase.New()
  30. '该调用是组件设计器所必需的。
  31. InitializeComponent()
  32. '在InitializeComponent()调用之后添加任何初始化
  33. EndSub
  34. 'UserService重写dispose以清理组件列表。
  35. ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)
  36. IfdisposingThen
  37. IfNot(componentsIsNothing)Then
  38. components.Dispose()
  39. EndIf
  40. EndIf
  41. MyBase.Dispose(disposing)
  42. EndSub
  43. '进程的主入口点
  44. <MTAThread()>_
  45. SharedSubMain()
  46. DimServicesToRun()AsSystem.ServiceProcess.ServiceBase
  47. '在同一进程中可以运行不止一个NT服务。若要将
  48. '另一个服务添加到此进程,请更改下行以
  49. '创建另一个服务对象。例如,
  50. '
  51. 'ServicesToRun=NewSystem.ServiceProcess.ServiceBase(){NewService1,NewMySecondUserService}
  52. '
  53. ServicesToRun=NewSystem.ServiceProcess.ServiceBase(){NewService1}
  54. System.ServiceProcess.ServiceBase.Run(ServicesToRun)
  55. EndSub
  56. '组件设计器所必需的
  57. PrivatecomponentsAsSystem.ComponentModel.IContainer
  58. '注意:以下过程是组件设计器所必需的
  59. '可以使用组件设计器修改此过程。
  60. '不要使用代码编辑器修改它。
  61. <System.Diagnostics.DebuggerStepThrough()>PrivateSubInitializeComponent()
  62. '
  63. 'Service1
  64. '
  65. Me.ServiceName="Server"
  66. EndSub
  67. #EndRegion
  68. ProtectedOverridesSubOnStart(ByValargs()AsString)
  69. '在此处添加启动服务的代码。此方法应设置具体的操作
  70. '以便服务可以执行它的工作。
  71. Try
  72. DimchAsNewTcp.TcpChannel(8212)'监听端口是在8212,你可以修改该端口
  73. ChannelServices.RegisterChannel(ch)'注册端口
  74. Remoting.RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType("serviceShare.serviceShare,serviceShare",True,True),"server",WellKnownObjectMode.Singleton)
  75. 'Type.GetType中的String是需要引用的服务所在的位置,"serviceShare.serviceShare,serviceShare"中前面俩个serviceShare是指服务所在的程序集中的要做服务的类。逗号后面的serviceShare是指该程序集位于的文件。后面的第三个参数:True就是表示要搜索该文件时不区分大小写。"server"表示服务的名称。
  76. CatchexAsException
  77. EventLog.WriteEntry("日志"&ex.Message)
  78. EndTry
  79. EndSub
  80. ProtectedOverridesSubOnStop()
  81. '在此处添加代码以执行停止服务所需的关闭操作。
  82. Try
  83. DimchAsNewTcp.TcpChannel(8212)
  84. ChannelServices.UnregisterChannel(ch)
  85. CatchexAsException
  86. EventLog.WriteEntry("日志"&ex.Message)
  87. EndTry
  88. EndSub
  89. EndClass
  90. serviceShare.vb'该文件为接口的实现文件,可以修改这个文件获得自己需要的服务,可以在这里引用 '其他DLL中的方法
  91. PublicClassserviceShare
  92. InheritsMarshalByRefObject
  93. Implementsshare.Iconnect
  94. PrivatesharediAsInt32=0
  95. PublicFunctiongetName()AsStringImplementsshare.Iconnect.getName
  96. i=i+1
  97. Return"fromServer"&i
  98. EndFunction
  99. EndClass
  100. [客户端]
  101. form1.vb
  102. ImportsSystem
  103. ImportsSystem.Runtime
  104. ImportsSystem.Runtime.Remoting
  105. ImportsSystem.Runtime.Remoting.Channels
  106. PublicClassForm1
  107. InheritsSystem.Windows.Forms.Form
  108. PrivatechAsTcp.TcpChannel
  109. #Region"Windows窗体设计器生成的代码"
  110. PublicSubNew()
  111. MyBase.New()
  112. '该调用是Windows窗体设计器所必需的。
  113. InitializeComponent()
  114. '在InitializeComponent()调用之后添加任何初始化
  115. EndSub
  116. '窗体重写dispose以清理组件列表。
  117. ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)
  118. IfdisposingThen
  119. IfNot(componentsIsNothing)Then
  120. components.Dispose()
  121. EndIf
  122. EndIf
  123. MyBase.Dispose(disposing)
  124. EndSub
  125. 'Windows窗体设计器所必需的
  126. PrivatecomponentsAsSystem.ComponentModel.IContainer
  127. '注意:以下过程是Windows窗体设计器所必需的
  128. '可以使用Windows窗体设计器修改此过程。
  129. '不要使用代码编辑器修改它。
  130. FriendWithEventsLabel1AsSystem.Windows.Forms.Label
  131. FriendWithEventsButton1AsSystem.Windows.Forms.Button
  132. <System.Diagnostics.DebuggerStepThrough()>PrivateSubInitializeComponent()
  133. Me.Label1=NewSystem.Windows.Forms.Label
  134. Me.Button1=NewSystem.Windows.Forms.Button
  135. Me.SuspendLayout()
  136. '
  137. 'Label1
  138. '
  139. Me.Label1.Location=NewSystem.Drawing.Point(80,50)
  140. Me.Label1.Name="Label1"
  141. Me.Label1.Size=NewSystem.Drawing.Size(125,25)
  142. Me.Label1.TabIndex=0
  143. Me.Label1.Text="Label1"
  144. '
  145. 'Button1
  146. '
  147. Me.Button1.Location=NewSystem.Drawing.Point(105,195)
  148. Me.Button1.Name="Button1"
  149. Me.Button1.Size=NewSystem.Drawing.Size(75,25)
  150. Me.Button1.TabIndex=1
  151. Me.Button1.Text="Button1"
  152. '
  153. 'Form1
  154. '
  155. Me.AutoScaleBaseSize=NewSystem.Drawing.Size(6,14)
  156. Me.ClientSize=NewSystem.Drawing.Size(292,273)
  157. Me.Controls.Add(Me.Button1)
  158. Me.Controls.Add(Me.Label1)
  159. Me.Name="Form1"
  160. Me.Text="Form1"
  161. Me.ResumeLayout(False)
  162. EndSub
  163. #EndRegion
  164. PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
  165. DimserverNameAsString
  166. DimaaAsshare.Iconnect
  167. serverName="tcp://127.0.0.1:8212/server"
  168. aa=CType(Activator.GetObject(Type.GetType("share.Iconnect,share",serverName),share.Iconnect)
  169. '注意这个地方
  170. Label1.Text=aa.getName()
  171. EndSub
  172. PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
  173. ch=NewTcp.TcpChannel'客户端可以不注册端口
  174. ChannelServices.RegisterChannel(ch)
  175. EndSub
  176. EndClass
  177. [服务安装]
  178. Strart.vb'服务安装
  179. ModuleStrart
  180. SubMain(ByValarg()AsString)
  181. OnErrorResumeNext
  182. #IfDEBUGThen
  183. IfIO.File.Exists("setup.bat")Then'批处理附后面
  184. Shell("setup.bat",True)
  185. EndIf
  186. #EndIf
  187. If(IO.File.Exists("testService.exe"))Then
  188. Shell(share.app.winPath&"/Microsoft.NET/Framework/v1.1.4322/InstallUtil.exe"_
  189. &share.app.appPath&"/testService.exe/LogFile",AppWinStyle.Hide,True)
  190. DimSc2AsNewSystem.ServiceProcess.ServiceController("server")
  191. IfSc2.Status=ServiceProcess.ServiceControllerStatus.StoppedThen
  192. Sc2.Start()
  193. EndIf
  194. EndIf
  195. EndSub
  196. EndModule
  197. [服务卸载]
  198. UnSetup.vb
  199. Modulestrart
  200. SubMain()
  201. OnErrorResumeNext
  202. If(IO.File.Exists("testservice.exe"))Then
  203. DimSc1AsNewSystem.ServiceProcess.ServiceController("server")
  204. IfSc1.Status=ServiceProcess.ServiceControllerStatus.RunningThen
  205. Sc1.Stop()
  206. EndIf
  207. Shell(share.app.winPath&"/Microsoft.NET/Framework/v1.1.4322/InstallUtil.exe/u"_
  208. &share.app.appPath&"/testservice.exe/LogFile",True)
  209. EndIf
  210. EndSub
  211. EndModule
  212. [批处理]
  213. copy../../serviceShare/bin/serviceShare.dll./serviceShare.dll
  214. copy../../test/bin/test.exe./test.exe
  215. copy../../shared/bin/share.dll./share.dll
  216. copy../../UnSetup/bin/UnSetup.exe./UnSetup.exe
  217. copy../../testService/bin/testService.exe./testService.exe
  218. 这样能方便的扩展自己的功能,因为很多书上的代码,使用都是抄微软的,如果程序是分开独立制作,只公布接口的话,安微软的做法就很难成功。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...