[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. 这样能方便的扩展自己的功能,因为很多书上的代码,使用都是抄微软的,如果程序是分开独立制作,只公布接口的话,安微软的做法就很难成功。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")