- 在.NET下的remoting使用里面,很多的书上都是使用了客户和服务器端都是使用一样共享成员或接口的示例来做说明。而且在实际的使用中有不小的问题。
- [共享代码]
- share.vb
- @H_404_30@ImportsSystem.windows.forms
- @H_404_30@Public@H_404_30@InterfaceIconnect'客户端和服务器端同时共享使用一个接口
- @H_404_30@FunctiongetName()@H_404_30@As@H_404_30@String
- @H_404_30@End@H_404_30@Interface
- @H_404_30@Public@H_404_30@Classapp
- @H_404_30@Public@H_404_30@Shared@H_404_30@ReadOnly@H_404_30@PropertyappPath()@H_404_30@As@H_404_30@String'提供一些应用程序常用路径将会在服务安装的Get'过程中被使用
- @H_404_30@ReturnApplication.StartupPath
- @H_404_30@End@H_404_30@Get
- @H_404_30@End@H_404_30@Property
- @H_404_30@Public@H_404_30@Shared@H_404_30@ReadOnly@H_404_30@PropertywinPath()@H_404_30@As@H_404_30@String
- @H_404_30@Get
- @H_404_30@ReturnSystem.Environment.GetEnvironmentVariable("windir")
- @H_404_30@End@H_404_30@Get
- @H_404_30@End@H_404_30@Property
- @H_404_30@End@H_404_30@Class
- [服务器端]'共俩个文件,第一个是服务文件,第二个是服务调用的功能实现文件
- service1.vb'引用了System.Runtime.Remoting.dll文件,这是服务
- @H_404_30@ImportsSystem.ServiceProcess
- @H_404_30@ImportsSystem.Runtime
- @H_404_30@ImportsSystem.Runtime.Remoting
- @H_404_30@ImportsSystem.Runtime.Remoting.Channels
- @H_404_30@Public@H_404_30@ClassService1
- @H_404_30@InheritsSystem.ServiceProcess.ServiceBase
- #Region"组件设计器生成的代码"
- @H_404_30@Public@H_404_30@Sub@H_404_30@New()
- @H_404_30@MyBase.@H_404_30@New()
- '该调用是组件设计器所必需的。
- InitializeComponent()
- '在InitializeComponent()调用之后添加任何初始化
- @H_404_30@End@H_404_30@Sub
- 'UserService重写dispose以清理组件列表。
- @H_404_30@Protected@H_404_30@Overloads@H_404_30@Overrides@H_404_30@SubDispose(@H_404_30@ByValdisposing@H_404_30@As@H_404_30@Boolean)
- @H_404_30@Ifdisposing@H_404_30@Then
- @H_404_30@If@H_404_30@Not(components@H_404_30@Is@H_404_30@Nothing)@H_404_30@Then
- components.Dispose()
- @H_404_30@End@H_404_30@If
- @H_404_30@End@H_404_30@If
- @H_404_30@MyBase.Dispose(disposing)
- @H_404_30@End@H_404_30@Sub
- '进程的主入口点
- <MTAThread()>_
- @H_404_30@Shared@H_404_30@SubMain()
- @H_404_30@DimServicesToRun()@H_404_30@AsSystem.ServiceProcess.ServiceBase
- '在同一进程中可以运行不止一个NT服务。若要将
- '另一个服务添加到此进程,请更改下行以
- '创建另一个服务对象。例如,
- '
- 'ServicesToRun=NewSystem.ServiceProcess.ServiceBase(){NewService1,NewMySecondUserService}
- '
- ServicesToRun=@H_404_30@NewSystem.ServiceProcess.ServiceBase(){@H_404_30@NewService1}
- System.ServiceProcess.ServiceBase.Run(ServicesToRun)
- @H_404_30@End@H_404_30@Sub
- '组件设计器所必需的
- @H_404_30@Privatecomponents@H_404_30@AsSystem.ComponentModel.IContainer
- '注意:以下过程是组件设计器所必需的
- '可以使用组件设计器修改此过程。
- '不要使用代码编辑器修改它。
- <System.Diagnostics.DebuggerStepThrough()>@H_404_30@Private@H_404_30@SubInitializeComponent()
- '
- 'Service1
- '
- @H_404_30@Me.ServiceName="Server"
- @H_404_30@End@H_404_30@Sub
- #EndRegion
- @H_404_30@Protected@H_404_30@Overrides@H_404_30@SubOnStart(@H_404_30@ByValargs()@H_404_30@As@H_404_30@String)
- '在此处添加启动服务的代码。此方法应设置具体的操作
- '以便服务可以执行它的工作。
- @H_404_30@Try
- @H_404_30@Dimch@H_404_30@As@H_404_30@NewTcp.TcpChannel(8212)'监听端口是在8212,你可以修改该端口
- ChannelServices.RegisterChannel(ch)'注册端口
- Remoting.RemotingConfiguration.RegisterWellKnownServiceType(Type.@H_404_30@GetType("serviceShare.serviceShare,serviceShare",@H_404_30@True,@H_404_30@True),"server",WellKnownObjectMode.Singleton)
- 'Type.GetType中的String是需要引用的服务所在的位置,"serviceShare.serviceShare,serviceShare"中前面俩个serviceShare是指服务所在的程序集中的要做服务的类。逗号后面的serviceShare是指该程序集位于的文件。后面的第三个参数:True就是表示要搜索该文件时不区分大小写。"server"表示服务的名称。
- @H_404_30@Catchex@H_404_30@AsException
- EventLog.WriteEntry("日志"&ex.Message)
- @H_404_30@End@H_404_30@Try
- @H_404_30@End@H_404_30@Sub
- @H_404_30@Protected@H_404_30@Overrides@H_404_30@SubOnStop()
- '在此处添加代码以执行停止服务所需的关闭操作。
- @H_404_30@Try
- @H_404_30@Dimch@H_404_30@As@H_404_30@NewTcp.TcpChannel(8212)
- ChannelServices.UnregisterChannel(ch)
- @H_404_30@Catchex@H_404_30@AsException
- EventLog.WriteEntry("日志"&ex.Message)
- @H_404_30@End@H_404_30@Try
- @H_404_30@End@H_404_30@Sub
- @H_404_30@End@H_404_30@Class
- serviceShare.vb'该文件为接口的实现文件,可以修改这个文件获得自己需要的服务,可以在这里引用 '其他DLL中的方法
- @H_404_30@Public@H_404_30@ClassserviceShare
- @H_404_30@InheritsMarshalByRefObject
- @H_404_30@Implementsshare.Iconnect
- @H_404_30@Privatesharedi@H_404_30@AsInt32=0
- @H_404_30@Public@H_404_30@FunctiongetName()@H_404_30@As@H_404_30@String@H_404_30@Implementsshare.Iconnect.getName
- i=i+1
- @H_404_30@Return"fromServer"&i
- @H_404_30@End@H_404_30@Function
- @H_404_30@End@H_404_30@Class
- [客户端]
- form1.vb
- @H_404_30@ImportsSystem
- @H_404_30@ImportsSystem.Runtime
- @H_404_30@ImportsSystem.Runtime.Remoting
- @H_404_30@ImportsSystem.Runtime.Remoting.Channels
- @H_404_30@Public@H_404_30@ClassForm1
- @H_404_30@InheritsSystem.Windows.Forms.Form
- @H_404_30@Privatech@H_404_30@AsTcp.TcpChannel
- #Region"Windows窗体设计器生成的代码"
- @H_404_30@Public@H_404_30@Sub@H_404_30@New()
- @H_404_30@MyBase.@H_404_30@New()
- '该调用是Windows窗体设计器所必需的。
- InitializeComponent()
- '在InitializeComponent()调用之后添加任何初始化
- @H_404_30@End@H_404_30@Sub
- '窗体重写dispose以清理组件列表。
- @H_404_30@Protected@H_404_30@Overloads@H_404_30@Overrides@H_404_30@SubDispose(@H_404_30@ByValdisposing@H_404_30@As@H_404_30@Boolean)
- @H_404_30@Ifdisposing@H_404_30@Then
- @H_404_30@If@H_404_30@Not(components@H_404_30@Is@H_404_30@Nothing)@H_404_30@Then
- components.Dispose()
- @H_404_30@End@H_404_30@If
- @H_404_30@End@H_404_30@If
- @H_404_30@MyBase.Dispose(disposing)
- @H_404_30@End@H_404_30@Sub
- 'Windows窗体设计器所必需的
- @H_404_30@Privatecomponents@H_404_30@AsSystem.ComponentModel.IContainer
- '注意:以下过程是Windows窗体设计器所必需的
- '可以使用Windows窗体设计器修改此过程。
- '不要使用代码编辑器修改它。
- @H_404_30@Friend@H_404_30@WithEventsLabel1@H_404_30@AsSystem.Windows.Forms.Label
- @H_404_30@Friend@H_404_30@WithEventsButton1@H_404_30@AsSystem.Windows.Forms.Button
- <System.Diagnostics.DebuggerStepThrough()>@H_404_30@Private@H_404_30@SubInitializeComponent()
- @H_404_30@Me.Label1=@H_404_30@NewSystem.Windows.Forms.Label
- @H_404_30@Me.Button1=@H_404_30@NewSystem.Windows.Forms.Button
- @H_404_30@Me.SuspendLayout()
- '
- 'Label1
- '
- @H_404_30@Me.Label1.Location=@H_404_30@NewSystem.Drawing.Point(80,50)
- @H_404_30@Me.Label1.Name="Label1"
- @H_404_30@Me.Label1.Size=@H_404_30@NewSystem.Drawing.Size(125,25)
- @H_404_30@Me.Label1.TabIndex=0
- @H_404_30@Me.Label1.Text="Label1"
- '
- 'Button1
- '
- @H_404_30@Me.Button1.Location=@H_404_30@NewSystem.Drawing.Point(105,195)
- @H_404_30@Me.Button1.Name="Button1"
- @H_404_30@Me.Button1.Size=@H_404_30@NewSystem.Drawing.Size(75,25)
- @H_404_30@Me.Button1.TabIndex=1
- @H_404_30@Me.Button1.Text="Button1"
- '
- 'Form1
- '
- @H_404_30@Me.AutoScaleBaseSize=@H_404_30@NewSystem.Drawing.Size(6,14)
- @H_404_30@Me.ClientSize=@H_404_30@NewSystem.Drawing.Size(292,273)
- @H_404_30@Me.Controls.Add(@H_404_30@Me.Button1)
- @H_404_30@Me.Controls.Add(@H_404_30@Me.Label1)
- @H_404_30@Me.Name="Form1"
- @H_404_30@Me.Text="Form1"
- @H_404_30@Me.ResumeLayout(@H_404_30@False)
- @H_404_30@End@H_404_30@Sub
- #EndRegion
- @H_404_30@Private@H_404_30@SubButton1_Click(@H_404_30@ByValsender@H_404_30@AsSystem.@H_404_30@Object,@H_404_30@ByVale@H_404_30@AsSystem.EventArgs)@H_404_30@HandlesButton1.Click
- @H_404_30@DimserverName@H_404_30@As@H_404_30@String
- @H_404_30@Dimaa@H_404_30@Asshare.Iconnect
- serverName="tcp://127.0.0.1:8212/server"
- aa=@H_404_30@CType(Activator.GetObject(Type.@H_404_30@GetType("share.Iconnect,share",serverName),share.Iconnect)
- '注意这个地方
- Label1.Text=aa.getName()
- @H_404_30@End@H_404_30@Sub
- @H_404_30@Private@H_404_30@SubForm1_Load(@H_404_30@ByValsender@H_404_30@AsSystem.@H_404_30@Object,@H_404_30@ByVale@H_404_30@AsSystem.EventArgs)@H_404_30@Handles@H_404_30@MyBase.Load
- ch=@H_404_30@NewTcp.TcpChannel'客户端可以不注册端口
- ChannelServices.RegisterChannel(ch)
- @H_404_30@End@H_404_30@Sub
- @H_404_30@End@H_404_30@Class
- [服务安装]
- Strart.vb'服务安装
- @H_404_30@ModuleStrart
- @H_404_30@SubMain(@H_404_30@ByValarg()@H_404_30@As@H_404_30@String)
- @H_404_30@On@H_404_30@Error@H_404_30@Resume@H_404_30@Next
- #IfDEBUGThen
- @H_404_30@IfIO.File.Exists("setup.bat")@H_404_30@Then'批处理附后面
- Shell("setup.bat",@H_404_30@True)
- @H_404_30@End@H_404_30@If
- #EndIf
- @H_404_30@If(IO.File.Exists("testService.exe"))@H_404_30@Then
- Shell(share.app.winPath&"/Microsoft.NET/Framework/v1.1.4322/InstallUtil.exe"_
- &share.app.appPath&"/testService.exe/LogFile",AppWinStyle.Hide,@H_404_30@True)
- @H_404_30@DimSc2@H_404_30@As@H_404_30@NewSystem.ServiceProcess.ServiceController("server")
- @H_404_30@IfSc2.Status=ServiceProcess.ServiceControllerStatus.Stopped@H_404_30@Then
- Sc2.Start()
- @H_404_30@End@H_404_30@If
- @H_404_30@End@H_404_30@If
- @H_404_30@End@H_404_30@Sub
- @H_404_30@End@H_404_30@Module
- [服务卸载]
- UnSetup.vb
- @H_404_30@Modulestrart
- @H_404_30@SubMain()
- @H_404_30@On@H_404_30@Error@H_404_30@Resume@H_404_30@Next
- @H_404_30@If(IO.File.Exists("testservice.exe"))@H_404_30@Then
- @H_404_30@DimSc1@H_404_30@As@H_404_30@NewSystem.ServiceProcess.ServiceController("server")
- @H_404_30@IfSc1.Status=ServiceProcess.ServiceControllerStatus.Running@H_404_30@Then
- Sc1.@H_404_30@Stop()
- @H_404_30@End@H_404_30@If
- Shell(share.app.winPath&"/Microsoft.NET/Framework/v1.1.4322/InstallUtil.exe/u"_
- &share.app.appPath&"/testservice.exe/LogFile",@H_404_30@True)
- @H_404_30@End@H_404_30@If
- @H_404_30@End@H_404_30@Sub
- @H_404_30@End@H_404_30@Module
- [批处理]
- 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
- 这样能方便的扩展自己的功能,因为很多书上的代码,使用都是抄微软的,如果程序是分开独立制作,只公布接口的话,安微软的做法就很难成功。