第三节 创建并使用一个类
在你能够通过网络调用一个对象之前,你必须有一个类库。所有的COM对象在你首次创建它们的过程中或者在机器中继续运行,在 VB.NET中,你可以使用<Serializable()>属性标记一个类,这样你的对象就是以字的方式发送,意思是说它是物理上被复制进入正在调用的应用程序过程中的。
显然,如果你想要激活一个在另外一个过程或另外一台机器中的对象的方法,你想要那个对象支持远程调用。要想这样的话,你可以从.NET系统类库中的MarshalByRefClass类或MarshalByRefComponent类中取得你的对象,与使用值传递的标准System.Object基本类不同,你是通过引用传递这些基本类。你也应该避免使用<Serializable>属性标记这个对象,因为你有可能并不希望这个对象连续,而是在服务器中运行它。
你可以创建一个简单的类库来检测外部远程调用,在 VS.NET集成环境中,创建一个新类库项目,取名为NETserver并把默认的 Class1.vb文件重命名为NETclass.vb。默认的情况下,这个类是从Component基本类中派生出来的,它是通过值传递的。你可以把 Inherits行改为通过引用传递你的类,把你的类改为MarshalByRefComponent的子类:
Public Class NETclass Inherits System.ComponentModel.MarshalByRefComponent
|
你可以添加方法到包含远程运行的代码的类上。例如,你可以编写一个方法从Pubs数据库中以一个作者ID来检索作者姓名,使用Imports语句添加一个引用到 System.Data.dll中。
Imports System.Data Imports System.Data.SQL
|
然后,添加一个方法到你的类上,用来检索相应的数据行并把作者姓名作为结果返回。参见下面列出的程序代码:
Public Function GetName(ByVal au_id As String) As String Const dbConn As String = "server=ineroth;uid=sa;pwd=;database=pubs" Dim cm As SQLCommand Dim dr As SQLDataReader Dim SQL As String SQL = "SELECT au_lname, au_fname " & "FROM authors WHERE au_id='" & au_id & "'" cm = New SQLCommand(SQL, dbConn) cm.ActiveConnection.Open() cm.Execute(dr) dr.Read() Return CStr(dr.Item("au_lname")) & ", " & CStr(dr.Item("au_fname")) End Function
|
你现在就有了一个可被远程调用的类了。
你的远程调用对象需要在它运行的地方有一个过程,并且这个主机过程需要使用远程系统来监听传到你的对象上的请求。 幸运的是,代码使得这过程很简单的。添加一个新的Console Application项目到 VS.NET中,在Solution Explorer中,添加新的项目。 你可能需要向下滚动卷轴找到Console Application图标, 改名为 NEThost。添加一个引用到System.Runtime.Remoting.dll并添加一个 Imports语句,然后使用远程系统 :
Imports System.Runtime.Remoting |
在控制台应用程序中,当应用程序启动时, Sub Main方法自动运行。 你可以在这个方法中添加几行代码来设置远程系统:
Sub Main() RemotingServices.ConfigureRemoting("...cfg") Console.WriteLine("Press to exit") Console.ReadLine() End Sub
|
ConfigureRemoting方法接收文件名并把它当成一个参数。这个文本文件包含配置远程调用所必需的信息,你需要创建这个文件,我过一会将介绍如何创建。