你没有使用强名称
给你一个例子:
C# 注册COM+组件步骤
孙建2002-10-28
1) 在建立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;
}
//如函数不等于真则回滚其中(!)相当于VB中的(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+服务器上
(1) 首先,必须为该程序集创建一个类型库。类型库是 .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
(2)应使用 .NET 框架 SDK 中的程序集注册工具 (regasm),通过一次操作同时完成类型库的创建和注册。这是在一台计算机上同时进行 .NET 和 COM 开发所能使用的最简单的工具。与 tlbexp 类似,regasm 有许多选项。在命令提示符处键入 regasm /?,可以查看所有选项。要使用 regasm 创建并注册一个类型库,可以使用相应的命令行,如:
regasm /tlb:MyCom.tlb MyCom.dll
(2) 最后我们要把我们编写好的组件放置到COM+服务器上去
Regsvcs /c myCom.dll
这样就可以把我们编写的组件放到COM+服务器。大事告捷!哈哈哈
给你一个例子:
C# 注册COM+组件步骤
孙建2002-10-28
1) 在建立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;
}
//如函数不等于真则回滚其中(!)相当于VB中的(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+服务器上
(1) 首先,必须为该程序集创建一个类型库。类型库是 .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
(2)应使用 .NET 框架 SDK 中的程序集注册工具 (regasm),通过一次操作同时完成类型库的创建和注册。这是在一台计算机上同时进行 .NET 和 COM 开发所能使用的最简单的工具。与 tlbexp 类似,regasm 有许多选项。在命令提示符处键入 regasm /?,可以查看所有选项。要使用 regasm 创建并注册一个类型库,可以使用相应的命令行,如:
regasm /tlb:MyCom.tlb MyCom.dll
(2) 最后我们要把我们编写好的组件放置到COM+服务器上去
Regsvcs /c myCom.dll
这样就可以把我们编写的组件放到COM+服务器。大事告捷!哈哈哈
Microsoft (R) .NET Framework Assembly Registration Utility 1.0.3705.0
Copyright (C) Microsoft Corporation 1998-2001. All rights reserved.RegAsm 错误:对注册表项 的访问被拒绝。执行regsvcs statclass.dll时出现如下错误
警告:类“StatClass.Areab”没有类接口,这意味着非托管晚期绑定调用无法利用 AutoCo
mplete 方法。
警告:类“StatClass.ArrayStatus”没有类接口,这意味着非托管晚期绑定调用无法利用
AutoComplete 方法。出现下列安装错误:
1: 无法注册程序集“StatClass, Version=1.0.1069.28233, Culture=neutral, PublicKey
Token=06ba7fb4796ef187”。
2: 对注册表项 的访问被拒绝。D:\Code\V#\StatClass\bin\Debug>regasm /tlb:statclass.tlb statclass.dll
Microsoft (R) .NET Framework Assembly Registration Utility 1.0.3705.0
Copyright (C) Microsoft Corporation 1998-2001. All rights reserved.RegAsm 错误:对注册表项 的访问被拒绝。
就可以了
Com+的类必须从System.EnterpriseServices.ServicedComponent派生;
每个方法最好使用[AutoComplete]属性自动提交事物;
还需要设置这个类需要事物的级别:
[ Transaction( TransactionOption.Required ) ],在.Net中有5个级别;
如果是Web程序的话,必须要注册程序集,用RegSvcs.exe;/// <summary>AccountType逻辑处理类</summary>
[ Transaction( TransactionOption.Required ) ]
public class AccountTypeLogic : ServicedComponent
{
public AccountTypeLogic()
{}
/// <summary>创建</summary>
[AutoComplete]
public void CreateAccountType( IAccountType newAccountType,ContextInfo context)
{
try
{
// }
catch( Exception ex)
{
ContextUtil.SetAbort();
context.SetError("Unhandled exception",ex);
throw;
}
}在AssemblyInfo.cs中设置:
[assembly: ApplicationID("64F61DF4-F4E0-4c82-BD65-7984FDD244FC")]
[assembly: ApplicationName(Com+Test_.Net")]
[assembly: Description("Com+_Test.Net")]
[assembly: AssemblyKeyFile("..\\..强名称.snk")]
[assembly: AssemblyKeyName("")]—————————————————————————————————
┏━★━━◆━━★━┓
♂欢|◢CSDN◣|使♂ ▲自由保存帖子,浏览,关注检测
┃迎|◥论坛助手◤|用┃ ▲完善的CSDN客户端工具
┗━☆━━◇━━━☆┛ ▲自动添加签名......让你更快,更爽,更方便地上CSDN...
http://www.csdn.net/expert/topic/573/573604.xml
http://www.chinaok.net/csdn/csdn.zip