- 在.NET下的remoting使用里面,很多的书上都是使用了客户和服务器端都是使用一样共享成员或接口的示例来做说明。而且在实际的使用中有不小的问题。
- [共享代码]
- share.vb
- ImportsSystem.windows.forms
- PublicInterfaceIconnect'客户端和服务器端同时共享使用一个接口
- FunctiongetName()AsString
- EndInterface
- PublicClassapp
- PublicSharedReadOnlyPropertyappPath()AsString'提供一些应用程序常用路径将会在服务安装的Get'过程中被使用
- ReturnApplication.StartupPath
- EndGet
- EndProperty
- PublicSharedReadOnlyPropertywinPath()AsString
- Get
- ReturnSystem.Environment.GetEnvironmentVariable("windir")
- EndGet
- EndProperty
- EndClass
- [服务器端]'共俩个文件,第一个是服务文件,第二个是服务调用的功能实现文件
- service1.vb'引用了System.Runtime.Remoting.dll文件,这是服务
- ImportsSystem.ServiceProcess
- ImportsSystem.Runtime
- ImportsSystem.Runtime.Remoting
- ImportsSystem.Runtime.Remoting.Channels
- PublicClassService1
- InheritsSystem.ServiceProcess.ServiceBase
- #Region"组件设计器生成的代码"
- PublicSubNew()
- MyBase.New()
- '该调用是组件设计器所必需的。
- InitializeComponent()
- '在InitializeComponent()调用之后添加任何初始化
- EndSub
- 'UserService重写dispose以清理组件列表。
- ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)
- IfdisposingThen
- IfNot(componentsIsNothing)Then
- components.Dispose()
- EndIf
- EndIf
- MyBase.Dispose(disposing)
- EndSub
- '进程的主入口点
- <MTAThread()>_
- SharedSubMain()
- DimServicesToRun()AsSystem.ServiceProcess.ServiceBase
- '在同一进程中可以运行不止一个NT服务。若要将
- '另一个服务添加到此进程,请更改下行以
- '创建另一个服务对象。例如,
- '
- 'ServicesToRun=NewSystem.ServiceProcess.ServiceBase(){NewService1,NewMySecondUserService}
- '
- ServicesToRun=NewSystem.ServiceProcess.ServiceBase(){NewService1}
- System.ServiceProcess.ServiceBase.Run(ServicesToRun)
- EndSub
- '组件设计器所必需的
- PrivatecomponentsAsSystem.ComponentModel.IContainer
- '注意:以下过程是组件设计器所必需的
- '可以使用组件设计器修改此过程。
- '不要使用代码编辑器修改它。
- <System.Diagnostics.DebuggerStepThrough()>PrivateSubInitializeComponent()
- '
- 'Service1
- '
- Me.ServiceName="Server"
- EndSub
- #EndRegion
- ProtectedOverridesSubOnStart(ByValargs()AsString)
- '在此处添加启动服务的代码。此方法应设置具体的操作
- '以便服务可以执行它的工作。
- Try
- DimchAsNewTcp.TcpChannel(8212)'监听端口是在8212,你可以修改该端口
- ChannelServices.RegisterChannel(ch)'注册端口
- Remoting.RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType("serviceShare.serviceShare,serviceShare",True,True),"server",WellKnownObjectMode.Singleton)
- 'Type.GetType中的String是需要引用的服务所在的位置,"serviceShare.serviceShare,serviceShare"中前面俩个serviceShare是指服务所在的程序集中的要做服务的类。逗号后面的serviceShare是指该程序集位于的文件。后面的第三个参数:True就是表示要搜索该文件时不区分大小写。"server"表示服务的名称。
- CatchexAsException
- EventLog.WriteEntry("日志"&ex.Message)
- EndTry
- EndSub
- ProtectedOverridesSubOnStop()
- '在此处添加代码以执行停止服务所需的关闭操作。
- Try
- DimchAsNewTcp.TcpChannel(8212)
- ChannelServices.UnregisterChannel(ch)
- CatchexAsException
- EventLog.WriteEntry("日志"&ex.Message)
- EndTry
- EndSub
- EndClass
- serviceShare.vb'该文件为接口的实现文件,可以修改这个文件获得自己需要的服务,可以在这里引用 '其他DLL中的方法
- PublicClassserviceShare
- InheritsMarshalByRefObject
- Implementsshare.Iconnect
- PrivatesharediAsInt32=0
- PublicFunctiongetName()AsStringImplementsshare.Iconnect.getName
- i=i+1
- Return"fromServer"&i
- EndFunction
- EndClass
- [客户端]
- form1.vb
- ImportsSystem
- ImportsSystem.Runtime
- ImportsSystem.Runtime.Remoting
- ImportsSystem.Runtime.Remoting.Channels
- PublicClassForm1
- InheritsSystem.Windows.Forms.Form
- PrivatechAsTcp.TcpChannel
- #Region"Windows窗体设计器生成的代码"
- PublicSubNew()
- MyBase.New()
- '该调用是Windows窗体设计器所必需的。
- InitializeComponent()
- '在InitializeComponent()调用之后添加任何初始化
- EndSub
- '窗体重写dispose以清理组件列表。
- ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)
- IfdisposingThen
- IfNot(componentsIsNothing)Then
- components.Dispose()
- EndIf
- EndIf
- MyBase.Dispose(disposing)
- EndSub
- 'Windows窗体设计器所必需的
- PrivatecomponentsAsSystem.ComponentModel.IContainer
- '注意:以下过程是Windows窗体设计器所必需的
- '可以使用Windows窗体设计器修改此过程。
- '不要使用代码编辑器修改它。
- FriendWithEventsLabel1AsSystem.Windows.Forms.Label
- FriendWithEventsButton1AsSystem.Windows.Forms.Button
- <System.Diagnostics.DebuggerStepThrough()>PrivateSubInitializeComponent()
- Me.Label1=NewSystem.Windows.Forms.Label
- Me.Button1=NewSystem.Windows.Forms.Button
- Me.SuspendLayout()
- '
- 'Label1
- '
- Me.Label1.Location=NewSystem.Drawing.Point(80,50)
- Me.Label1.Name="Label1"
- Me.Label1.Size=NewSystem.Drawing.Size(125,25)
- Me.Label1.TabIndex=0
- Me.Label1.Text="Label1"
- '
- 'Button1
- '
- Me.Button1.Location=NewSystem.Drawing.Point(105,195)
- Me.Button1.Name="Button1"
- Me.Button1.Size=NewSystem.Drawing.Size(75,25)
- Me.Button1.TabIndex=1
- Me.Button1.Text="Button1"
- '
- 'Form1
- '
- Me.AutoScaleBaseSize=NewSystem.Drawing.Size(6,14)
- Me.ClientSize=NewSystem.Drawing.Size(292,273)
- Me.Controls.Add(Me.Button1)
- Me.Controls.Add(Me.Label1)
- Me.Name="Form1"
- Me.Text="Form1"
- Me.ResumeLayout(False)
- EndSub
- #EndRegion
- PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
- DimserverNameAsString
- DimaaAsshare.Iconnect
- serverName="tcp://127.0.0.1:8212/server"
- aa=CType(Activator.GetObject(Type.GetType("share.Iconnect,share",serverName),share.Iconnect)
- '注意这个地方
- Label1.Text=aa.getName()
- EndSub
- PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
- ch=NewTcp.TcpChannel'客户端可以不注册端口
- ChannelServices.RegisterChannel(ch)
- EndSub
- EndClass
- [服务安装]
- Strart.vb'服务安装
- ModuleStrart
- SubMain(ByValarg()AsString)
- OnErrorResumeNext
- #IfDEBUGThen
- IfIO.File.Exists("setup.bat")Then'批处理附后面
- Shell("setup.bat",True)
- EndIf
- #EndIf
- If(IO.File.Exists("testService.exe"))Then
- Shell(share.app.winPath&"/Microsoft.NET/Framework/v1.1.4322/InstallUtil.exe"_
- &share.app.appPath&"/testService.exe/LogFile",AppWinStyle.Hide,True)
- DimSc2AsNewSystem.ServiceProcess.ServiceController("server")
- IfSc2.Status=ServiceProcess.ServiceControllerStatus.StoppedThen
- Sc2.Start()
- EndIf
- EndIf
- EndSub
- EndModule
- [服务卸载]
- UnSetup.vb
- Modulestrart
- SubMain()
- OnErrorResumeNext
- If(IO.File.Exists("testservice.exe"))Then
- DimSc1AsNewSystem.ServiceProcess.ServiceController("server")
- IfSc1.Status=ServiceProcess.ServiceControllerStatus.RunningThen
- Sc1.Stop()
- EndIf
- Shell(share.app.winPath&"/Microsoft.NET/Framework/v1.1.4322/InstallUtil.exe/u"_
- &share.app.appPath&"/testservice.exe/LogFile",True)
- EndIf
- EndSub
- EndModule
- [批处理]
- copy../../serviceShare/bin/serviceShare.dll./serviceShare.dll
- copy../../test/bin/test.exe./test.exe
- copy../../shared/bin/share.dll./share.dll
- copy../../UnSetup/bin/UnSetup.exe./UnSetup.exe
- copy../../testService/bin/testService.exe./testService.exe
- 这样能方便的扩展自己的功能,因为很多书上的代码,使用都是抄微软的,如果程序是分开独立制作,只公布接口的话,安微软的做法就很难成功。