关于在vs 2005 C#中如何使用COM+,这是前几天作项目遇到的,一开始真是一头雾水,上网查了好多资料也是好多说法,经过一翻努力终于搞定,呵呵,现在把使用过程记录下来,希望能与大家一起分享!
COM+需要服务器端(部署服务或组件)和客户端(使用服务),我觉得COM+更合适于B/S系统中,当然在我做的银行管理系统中C/S和B/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) 这样,服务器就构建完成。
(九) 打开我的电脑,控制面板
(十) 在server上按右键,打开属性,修改安全性:调用身份验证级别为:无,模拟级别为标识。授权下的勾去掉( 这些是根据情况需要更改的,现在仅仅做个本机上的列子
(十一) 建立客户端。建一个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();
}
}
}