




















在建立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: 在此处添加构造函数逻辑
//
}
}
}
或者:设置项目配置里的生成属性,为Com Interop 注册:True

(2) 最后我们要把我们编写好的组件放置到COM+服务器上去
Regsvcs /c myCom.dll
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。