您的位置:首页 > 编程语言 > C#

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

2009-06-04 10:04 337 查看
关于在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)  这样,服务器就构建完成。

(九) 打开我的电脑,控制面板 ,管理工具,组件服务,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();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐