在vs 2005 C#中如何使用COM+(原创)

关于在vs 2005 C#中如何使用COM+,这是前几天作项目遇到的,一开始真是一头雾水,上网查了好多资料也是好多说法,经过一翻努力终于搞定,呵呵,现在把使用过程记录下来,希望能与大家一起分享!

COM+需要服务器端(部署服务或组件)和客户端(使用服务),我觉得COM+更合适于B/S系统中,当然在我做的银行管理系统中C/SB/S都有了!下面就开始吧…..

(一)   在解决方案中:[文件]->[添加]->[新建项目]->[类库]  (我是使用一个类库改造成Com+),把它命名为Bank,它包含两个文件{Bank.cs(Class1.cs重命名成Bank.cs得到的)AssemblyInfo.cs}

(二)   Bank类库中添加引用,[右击]->[添加引用]->.NET组件中->System.EnterpriseServices

(三)   回到Bank.cs中在代码上添加using System.EnterpriseServices; 然后定义银行操作的接口,BankOperation

         //BankOperation 接口的定义

      public interface BankOperation

 {

         .

         //利用卡号取款

        bool WithdrawByCardNo(string CardNo, decimal amount);

 }

(四)   改造Bank.cs中的Bank,让它继承BankOperation接口和ServicedComponent, 它会自动有个提示,按Tab,便会生成接口中抽象类的实现

         public class Bank : ServicedComponent, BankOperation

{

     

      bool WithdrawByCardNo(string CardNo, decimal amount)

      {

          Throw(异常);

          //此处就是操作的具体实现了,当然要自己写代码

         }

}

(五)   可以Bank.cs中也可以在AssemblyInfo.cs中添加设置一些使用时的配置(如设置服务器启动模式,组件安全性,认证方式,代理等等..相关的资料上网找找吧…)代码如下

命名空间外:

using System;

using System.Collections.Generic;

using System.Text;

using System.Data.SqlClient;

using System.Collections;

using System.EnterpriseServices;

//配置Bank组件的安全性,并且说明组件的激活方式是服务器激活

[assembly: ApplicationAccessControl(

        AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent,//进程安全级别,组件级别

        Authentication = AuthenticationOption.Call,//认证为调用每个方法时都要认证

        ImpersonationLevel = ImpersonationLevelOption.Delegate)]//安全性的扮演角色是代理

//激活方式:服务器激活

[assembly: ApplicationActivation(ActivationOption.Server)]

 

namespace Bank

{

}

命名空间中:

     //设置支持事务

    [Transaction(TransactionOption.Supported)]

    //使用对象池,最小共享量是10,最大共享容量是50,创建时限是30,单位从毫秒记

    [ObjectPooling(true, 10, 50, CreationTimeout = 30000)]

    //使用用时激活(JITA)

    [JustInTimeActivation(true)]

    //定义构造字符串

    [ConstructionEnabled(Default = "server=.;database=Bank;uid=sa;pwd=sa;")]

    //定义安全角色

[SecurityRole("bank", true)]

[ComponentAccessControl]

 

关于构造字符串的使用:

     在类Bank重置Construct()方法

         string connString;

        protected override void Construct(string s)

        {

            base.Construct(s);

            connString = s;

    }

(六)   以上就是实现一个COM服务,要想使用它那还几步要操作,那就是生成它的一个强名称

(相当于注册了),步骤如下:

1.打开vs 2005命令提示符:系统的[开始]->[所有程序]->[Microsoft visual studio 2005]->[Visual studio Tools]->[Visual studio 2005 命令提示]

2.输入cd 路径(你这个类库所在的文件绝对路径)比如我的文件在E:\C#\电子银行\Bank  E:\C#\电子银行\Bank >然后输入 sn –k Bank.snk;生成密匙Bank.snk为生成的文件名称,( 执行完成后,文件里会多出一个文件Bank.snk )

(七)   强名称生成完后,回到程序AssemblyInfo.cs中最后几排,可以发现(也可能没有自己写)[assembly: AssemblyKeyFile(" ")]

把文件路径写进去[assembly: AssemblyKeyFile("..\\..\\server.snk")]

(八)   在解决方案---…>电子银行\Bank\obj\Debug,在obj \ debug 中会有个Bank.dll回到Visual Studio .Net2005 命令提示,到文件obj\debug目录下(cd obj\debug),执行regsvcs 命令,注册服务。我机器上是这样的E:\C#\电子银行\Bank\obj\debug > regsvcs Bank.dll;(regsvcs *.dll)  这样,服务器就构建完成。

(九)   打开我的电脑,控制面板 ,管理工具,组件服务,com+应用程序 ,现在我们可以看到com+中多了个,Bank这个就是你所建的服务器

(十)   server上按右键,打开属性,修改安全性:调用身份验证级别为:无,模拟级别为标识。授权下的勾去掉( 这些是根据情况需要更改的,现在仅仅做个本机上的列子 )。然后找到激活,远程服务器名称 改成你自己机器的IP地址。

(十一)            建立客户端。建一个winfrom(窗体)ATM,加入引用:using System.EnterpriseServices

 using Bank;在客户端要引用的地方new(创建Bank的对象如private Bank.Bank bank;           Bank为类库,引其中的Bank) 一下就可以直接用其中的方法了。

 

 

以上便是创建和使用com+的过程,大家相互学习有什么问题一起讨论….

附部分代码:

<Bank类库>

using System;

using System.Collections.Generic;

using System.Text;

using System.Data.SqlClient;

using System.Collections;

using System.EnterpriseServices;

 

 

//配置Bank组件的安全性,并且说明组件的激活方式是服务器激活

[assembly: ApplicationAccessControl(

        AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent,//进程安全级别,组件级别

        Authentication = AuthenticationOption.Call,//认证为调用每个方法时都要认证

        ImpersonationLevel = ImpersonationLevelOption.Delegate)]//安全性的扮演角色是代理

//激活方式:服务器激活

[assembly: ApplicationActivation(ActivationOption.Server)]

 

namespace Bank

{

   

    //定义所有的操作

    //BankOperation 接口的定义

    public interface BankOperation

    {

        .

        //利用卡号取款

        bool WithdrawByCardNo(string CardNo, decimal amount);

    }

 

    //设置支持事务

    [Transaction(TransactionOption.Supported)]

    //使用对象池,最小共享量是10,最大共享容量是50,创建时限是30,单位从毫秒记

    [ObjectPooling(true, 10, 50, CreationTimeout = 30000)]

    //使用用时激活(JITA)

    [JustInTimeActivation(true)]

    //定义构造字符串

    [ConstructionEnabled(Default = "server=.;database=Bank;uid=sa;pwd=sa;")]

    //定义安全角色

    [SecurityRole("bank", true)]

    [ComponentAccessControl]

 

    public class Bank : ServicedComponent, BankOperation

    {

        private string connString;

        public Bank()

        {

 

        }

        //重置Construct()方法

        protected override void Construct(string s)

        {

            base.Construct(s);

            connString = s;

        }

 

        //GetConnection()方法用配置好的连接字符串从数据库获取数据库链接

        private SqlConnection GetConncetion()

        {

            SqlConnection conn = new SqlConnection();

            conn.ConnectionString = connString;

            return conn;

        }

         #region BankOperation 成员

        public bool WithdrawByCardNo(string CardNo, decimal amount)

        {        …………

            string AccountNo;

            bool result;

            AccountNo = QueryAccountNo(CardNo);

            if (AccountNo == "error")

            {

                result = false;

            }

            else

            {

                result = WithdrawByAccountNo(AccountNo, amount);

            }

            return result;

        }

        #endregion    }}

 

<ATM窗体>

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Bank;

 

namespace 电子银行

{

    public partial class ATM : Form

    {

      

        private Bank.Bank bank;

 

        public ATM()

        {

           ..

            bank = new Bank.Bank();

        }

    }

}

原文地址:https://www.cnblogs.com/gaojun/p/1495893.html