N-Tiers开发方式,如何使用VB.NET撰写COM+组件?

小喵撰写COM+组件开始于VB6的年代,撰写与注册的方式还算不是很复杂,不过随着进入了.NET的世界,撰写的过程也变得比较复杂了许多。

以下是撰写的步骤

假设要撰写的是一个数据库DDMO中的数据表(TDMOMenu)的数据存取组件,要产生一个组件服务中的Package名称为【KDMO1000】,里面有个组件PDMOMenu.dll内有两个COM+组件分别是

Project.Class

  1. PDMOMenu.CDMOMenu1(无Transaction):用以读取数据
  2. PDMOMenu.CDMOMenu2(有Transaction):用以维护数据

撰写步骤:

  1. 建专案:
    1. 请在适当的目录下,建立您组件项目的目录【PDMOMenu】
    2. 建立项目(Create Project),选择【类别库(Class Library)】,目录请设定为您项目的目录,Name设定为【PDMOMenu】
    3. 方案总管(Solution Explorer)中点选Class1.vb,变更属性(Properties)中的檔名(File Name)为【CDMOMenu1.vb】(无TranSaction),【CDMOMenu2.vb】(有Transaction)
    4. 参考(Reference)右键→加入参考,增加【System.EnterpriseServices】
  2. 项目内容:
    1. 点选项目(Project)右键→属性(Properties)
    2. 点选【签署(Signing)】,勾选【签署组件】
      1. 在选择强势名称密钥档(Choose a strong name key file):
      2. 选择新增(New)→输入【PDMOMenu】
    3. 点选【应用程序(Application)】

      检查【组件名称(Assembly Name)】、【根命名空间(Root NameSpace)】是否是【PDMOMenu】

    4. 按【组件信息】,将【让组件成为COM-Visiable(Make assembly COM-Visiable)】打勾
  3. AssemblyInfo.vb:
    1. 请在最上方Imports加入:

      Imports System.EnterpriseServices

    2. 请在最下方加入以下指令:

      <Assembly: ApplicationName("KDMO1000")> '*设定组件服务的项目名称

      <Assembly: ApplicationAccessControl(False)>

      <Assembly: ApplicationActivation(ActivationOption.Server)>

  4. Class 内容:
    1. 无Transaction Class(CDMOMenu1.vb):
    2. Imports System.EnterpriseServices 
      Imports System.Runtime.InteropServices 
      Imports System.Data.SqlClient 
      Imports System.Data 
      Imports System.IO 
       
      'Guid请在组件第一次建立时,产生新的,之后修改时不必变更 
      "838A5FE4-2DCC-43DF-8658-0697E8FB7C0F"), _ 
       EventTrackingEnabled(True)> _ 
       Public Class CDMOMenu1 
       
          Inherits ServicedComponent 
          Const DBName as String = "DDMO"    
       
            Public Function Test1(ByVal In1() As String, ByVal Out1() As String, ByRef P As String, ByRef R As String, ByVal User As String) As String 
               '************************************************************************* 
               '**     撰写者:topcat             撰写日期:2006/8/9 
               '**     用途:  1. 
               '**     做法: 
               '**             1. 
               '**     注意事项: 
               '**             1. 
               '**             2. 
               '**     维护记录: 
               '**         维护者:姓名             维护日期:日期 
               '**         维护项目: 
               '**                 1. 
               '**                 2. 
               '**         做法:  1. 
               '**                 2. 
               '**         注意事项: 
               '**                 1. 
               '************************************************************************* 
       
              Dim ConnStr As String = GetConnStr(DBName) 
              Using Conn As New SqlConnection(ConnStr)
                   Try 
           
                       Test1 = "Success" 
           
                   Catch ex As Exception 
                       Test1 = "False" 
                       Throw New Exception(ex.Message) 
           
                   End Try 
              End Using
           End Function 
       
            Public Function GetConnStr(ByVal DBName As String) As String 
               '************************************************************************* 
               '**     撰写者:topcat     撰写日期:2006/2/8 
               '**     用途:  1.读取Connection String的方式 
               '**     做法: 
               '**             1.传入参数DataBase Name DBName 
               '**             2.透过Stream将文本文件读出 
               '**             3.将取得的资料传回 
               '**             4.关闭相关对象 
               '**     注意事项: 
               '**             1. 
               '**             2. 
               '**     维护记录: 
               '**         维护者:姓名(员工代号)     维护日期:日期 
               '**         维护项目: 
               '**                 1. 
               '**                 2. 
               '**         做法:  1. 
               '**                 2. 
               '**         注意事项: 
               '**                 1. 
               '************************************************************************* 
       
               Dim StrmRd As New StreamReader("C:\DataLink\" + DBName + ".ini") 
               Dim Line As String = "" 
               Dim ConnStr As String = "" 
               Try 
                   Do 
                       Line = StrmRd.ReadLine() 
                       If Line <> "" Then 
                           ConnStr += Line 
                       End If 
                   Loop Until Line Is Nothing 
                   GetConnStr = ConnStr 
       
               Catch ex As Exception 
                   Throw New Exception(ex.Message.ToString) 
       
               Finally 
                   StrmRd.Close() 
                   StrmRd.Dispose() 
                   StrmRd = Nothing 
       
               End Try 
           End Function 
       End Class
      
    3. 有Transaction Class(CDMOMenu2.vb):
    4. Imports System.EnterpriseServices 
       Imports System.Runtime.InteropServices 
       Imports System.Data.SqlClient 
       Imports System.Data 
       Imports System.IO 
       
       
      "28549732-9A0F-4731-9688-10CEE644500E") _ 
       , Transaction(TransactionOption.Required) _ 
       , Synchronization(SynchronizationOption.Required) _ 
       , JustInTimeActivation(True) _ 
       , EventTrackingEnabled(True)> _ 
       Public Class CDMOMenu2 
           Inherits ServicedComponent 
       
           Const DBName as String = "DDMO"    
       
       
            _ 
            Public Function Test2(ByVal In1() As String, ByVal Out1() As String, ByRef P As String, ByRef R As String, ByVal User As String) As String 
               '************************************************************************* 
               '**     撰写者:topcat             撰写日期:2006/8/9 
               '**     用途:  1. 
               '**     做法: 
               '**             1. 
               '**     注意事项: 
               '**             1. 
               '**             2. 
               '**     维护记录: 
               '**         维护者:姓名(员工代号)     维护日期:日期 
               '**         维护项目: 
               '**                 1. 
               '**                 2. 
               '**         做法:  1. 
               '**                 2. 
               '**         注意事项: 
               '**                 1. 
               '************************************************************************* 
       
               Dim ConnStr As String = GetConnStr(DBName) 
              Using Conn As New SqlConnection(ConnStr)
                  Try 
      
                      Test2 = "Success" 
                  Catch ex As Exception 
                      Test2 = "False" 
                      Throw New Exception(ex.Message) 
                  End Try 
              End Using
           End Function 
       
            Public Function GetConnStr(ByVal DBName As String) As String 
               '************************************************************************* 
               '**     撰写者:topcat     撰写日期:2006/2/8 
               '**     用途:  1.读取Connection String的方式 
               '**     做法: 
               '**             1.传入参数DataBase Name DBName 
               '**             2.透过Stream将文本文件读出 
               '**             3.将取得的资料传回 
               '**             4.关闭相关对象 
               '**     注意事项: 
               '**             1. 
               '**             2. 
               '**     维护记录: 
               '**         维护者:姓名(员工代号)     维护日期:日期 
               '**         维护项目: 
               '**                 1. 
               '**                 2. 
               '**         做法:  1. 
               '**                 2. 
               '**         注意事项: 
               '**                 1. 
               '************************************************************************* 
       
               Dim StrmRd As New StreamReader("C:\DataLink\" + DBName + ".ini") 
               Dim Line As String = "" 
               Dim ConnStr As String = "" 
               Try 
                   Do 
                       Line = StrmRd.ReadLine() 
                       If Line <> "" Then 
                           ConnStr += Line 
                       End If 
                   Loop Until Line Is Nothing 
                   GetConnStr = ConnStr 
       
               Catch ex As Exception 
                   Throw New Exception(ex.Message.ToString) 
       
               Finally 
                   StrmRd.Close() 
                   StrmRd.Dispose() 
                   StrmRd = Nothing 
       
               End Try 
           End Function 
       
       End Class
      

撰写完相关的程序后,接着就是Build项目,然后就会依照Project的Property设定的位置产生dll