• 推荐
  • 评论
  • 收藏

C# 注册COM+组件步骤

2022-11-05    3855次浏览

1. 编写Com+组件

在建立C#工程之后必须要给类一个强名称.

    要创建强名称,可以使用 sn 工具.此命令行工具有许多选项,在命令提示符处键入 sn /? 可以查看所有选项.对程序集签名所需的选项是“-k”,它将创建一个密钥文件.默认情况下,该文件使用 .snk 作为扩展名.例如,要创建一个名为 MyCom.snk 的密钥文件,可以使用以下命令行:
sn -k MyCom.snk
然后在工程中引用这个强名称
方法如下:
( 1 ):注释掉AssemblyInfo.cs中的[assembly: AssemblyKeyFile( "" )]和[assembly: AssemblyKeyName( "" )]
( 2 ): 在组件类中写入
using System.Data.OleDb;//引用ADO.net命名空间
using System.Data;//引用数据空间
using System.Runtime.InteropServices;//为了调用GUID
System.EnterpriseServices命名空间包涵所有COM+的类型库所以在编写COM+组件的时候一定要用到System.EnterpriseServices命名空间,这个命名空间在引用中.net页下可以找到
using System.EnterpriseServices;//引用COM+名命空间
using System.Runtime.CompilerServices;//运行时编译服务器
using System.Reflection;//用些全局属性取得强名属性
[assembly: ApplicationName( "myCom" )]
//强名文件名和文件属性.用sn.exe生成,用法 sn -k mycom.snk
[assembly: AssemblyKeyFileAttribute( "mycom.snk" )]
[assembly: AssemblyKeyName( "mycom.snk" )]
( 3 )组件类的写法
组件类的写法有二种一种是以前的那种
一种是基于接口编程的例如:

namespace myCom//把所有代码写到相应的命名空间内
{
    //每一个接口一个GUID号
    [Guid( "549047DE-9F3B-4781-A1F6-F3C852091FC9" )]
    //接口类型ComInterfaceType.InterfaceIsDual接示接口需要双重公开给COM+
    
//这个属性是接口的属性
    [InterfaceType( ComInterfaceType.InterfaceIsDual )]
    //定义接口
    public interface Add
    
    {
        接口内的方法返回布尔值有一个整型参数
        bool AddData( int d );
        
        bool AddDataM( int d );
    }
    //实现这个接口
    //事务属性表示需要新事务
    
//这个属性用来记录类是否支持事务有车个选项同VB中类的属性相同
    [Transaction( TransactionOption.RequiresNew)]
    //在类中实现这个接口必须要继承System.EnterpriseServices;命名空间的ServicedComponent类
    
//在后面继承前面所定义的接口如果有多个可以用“,”分开
    public class myClass:ServicedComponent,Add
    {
        //  public myCom.myClass   error =new ErrorsLibrary.Class1( );
        
        //定认字符变量用来存放数据库连接字符串
        private static string strConnect ="Provider=MSDAORA.1;Password=erpii;User ID=erpii;Data Source=erpii;Persist Security Info=True";
        //创建这个连接
        private OleDbConnection conConnection = new OleDbConnection (strConnect) ;
        
        
        //实现接口中的查询方法
        public bool AddData( int id )
        {
            try
            {
                
                //string StrSql="insert into    TEST1   values('" + id + "' )";
                string StrSql=" insert into    test_d  values('" + id + "'," 
                +"'" + id + "',"
                + "'" + id + "',"
                + "'" + id + "' )";
                //     string StrSql="DELETE FROM TEST1"; 
                
//找开连接
                conConnection.Open( ); // 打开数据连接
                
//执行查询
                OleDbCommand cmd = new OleDbCommand (StrSql , conConnection) ;
                cmd.ExecuteNonQuery ( );
                conConnection.Close ( );
                
                //ContextUtil.SetComplete( ) ;
                return true;
            }
            catch ( Exception e ) 
            {
                
                //error.Description =e.Message;
                
//    EnterpriseServices.ContexUtil.
                ContextUtil.SetAbort( );
                return false;
                //    
            }
        }
        
        public bool AddDataM( int id )
        {
            try
            {
                //    string StrSql="insert into    TEST21  values(" + id + "' )";
                //    string StrSql="DELETE FROM TEST2"; 
                
//找开连接
                string StrSql=" insert into    test_m  values('" + id + "'," 
                +"'" + id + "',"
                + "'" + id + "',"
                + "'" + id + "' )";
                conConnection.Open( ); // 打开数据连接
                //执行查询
                OleDbCommand cmd = new OleDbCommand (StrSql , conConnection) ;
                cmd.ExecuteNonQuery ( );
                conConnection.Close ( );
                //    System.EnterpriseServices.ContextUtil.SetComplete( ) ;
                return true;
                
            }
            catch ( Exception e ) 
            {
                //error.Description =e.Message;
                //    EnterpriseServices.ContexUtil.
                //    System.EnterpriseServices.ContextUtil.SetAbort( );
                
//    e.Message;
                ContextUtil.SetAbort ( ) ;
                return false;
                
            }
            
        }
        
        //如果在方法或类上使用[AutoComplete]则事务类或方法在没有错误的情状下自动提交事务
        [AutoComplete]
        public bool addRs( )
        {
            
            try
            {
                for ( int i=0;i<100;i++ )
                {
                    ////       
                    if ( !AddData( i ) )
                    {    //事务回滚
                        ContextUtil.SetAbort ( ) ;
      函数返回值
                        return false;
                    }
                    //如函数不等于真则回滚其中(?┫嗟庇赩B中的(NOT)
                    if (!AddDataM( i ) )
                    
                    {
                        ContextUtil.SetAbort ( ) ;
                        return false;
                    }
                    
                }
                   如查成功能提交事务
                ContextUtil.SetComplete( ); 
                return  true;
                
            }
            
            
            catch ( Exception e ) 
            {
                //      error.Description =e.Message;
                //    EnterpriseServices.ContexUtil.
                
//    ContextUtil.SetAbort( );
                ContextUtil.SetAbort ( ) ;
                return false;
                //    
            }
        }
        
        public myClass( )
        {
            //
            // TODO: 在此处添加构造函数逻辑
            
//
        }
    }
}

2. 在代码编写完成之后要注册我的组件到COM+服务器上

2.1 编译成COM+组件

  •  首先,必须为该程序集创建一个类型库.类型库是 .NET 程序集中所包含的元数据的 COM 等效组件.类型库通常包含在扩展名为 .tlb 的文件中.类型库包含必要信息,COM 客户端使用这些信息可以确定在特定服务器中有哪些类,以及这些类支持的方法、属性和事件..NET 框架 SDK 包含一个名为 tlbexp(类型库导出程序)的工具,它可以从程序集创建类型库.tlbexp 包含许多选项,可以在命令提示符处键入 tlbexp /? 查看所有选项.其中一个是 /out 选项,用于指定已生成的类型库的名称.(如果您不自己指定名称,将自动为您创建一个名称.)例如,要将元数据从一个名为 MyCom.dll 的程序集提取到一个名为 MyCom.tlb 的类型库中,可以使用以下命令行:
    *注意:tlbexp MyCom.dll /out:MyCom.tlb的命令中out:MyCom.tlb
    out: 和   MyCom.tlb   就是要导出的类型库文件中间一定要有一个空格
    tlbexp MyCom.dll /out:MyCom.tlb
  • 应使用 .NET 框架 SDK 中的程序集注册工具 ( regasm ),通过一次操作同时完成类型库的创建和注册.这是在一台计算机上同时进行 .NET 和 COM 开发所能使用的最简单的工具.与 tlbexp 类似,regasm 有许多选项.在命令提示符处键入 regasm /?,可以查看所有选项.要使用 regasm 创建并注册一个类型库,可以使用相应的命令行,如:
    regasm /tlb:MyCom.tlb MyCom.dll

或者:设置项目配置里的生成属性,为Com Interop 注册:True

2.2 注册Com+组件

(2) 最后我们要把我们编写好的组件放置到COM+服务器上去
Regsvcs /c   myCom.dll

原文地址:https://www.cnblogs.com/Leo_wl/p/1979545.html