创建com对象:用C#创建COM对象



在本篇文章中我们将讨论下面问题:
  ·使用C#创建个简单COM对象(使用COMInterop特性)
  ·从VC客户端软件Software中访问COM客户端软件Software使用了TypeLibrary(.TLB文件)
  为了简单和方便开发人员使用、测试起见我们使用了SQLSERVER数据库软件Software缺省安装中Northwind数据库
  ·修改COM对象中SQLServer名字和SQLServer连接
  ·我们已经创建了连接数据库用分别为scott、tiger用户名和口令我们可以使用它或者其他现有用户名和口令
  部分:用C#创建简单COM对象
  COM对象是ClassLibrary类它生成DLL文件要在VS开发环境中创建个简单COM对象我们可以依次选择“文件”->;“新创建”->;“工程”->;“VisualC#工程”->;“类库”然后创建个名字为Database_COMObject工程

  需要注意是:在COM中VC#对象需要下面条件:
  ·类必须是public性质
  ·特性、思路方法和事件必须是public性质
  ·特性和思路方法必须在类接口中定义
  ·事件必须在事件接口中定义
  不是在这些接口中定义public性质类成员不能被COM访问但它们可以被其他.NET Framework对象访问要让COM能够访问特性和思路方法我们必须在类接口中定义它们使它们具有DispId属性并在类中实现这些特性和思路方法这些成员定义时顺序也就是它们在COM中顺序要让COM访问类中事件必须在事件接口中定义这些事件并赋予它们DispId属性事件接口不应当由类完成类只实现类接口(它可以实现不止个接口但第个接口是缺省接口)应当在缺省接口中实现需要让COM访问思路方法和特性思路方法和特性必须被标识为public性质并符合在类接口中定义需要让COM访问事件也在缺省类接口中完成它们也必须被标识为public性质并符合事件接口中定义
  在接口名字的前每个接口需要个GUID特性要生成变个唯Guid需要运行guidgen.exe工具软件Software并选择“注册表格式” 下面是个类界面:

[Guid(\";694C1820-04B6-4988-928F-FD858B95C880\";)]
public erface DBCOM_Interface
{
[DispId(1)]
void Init( userid , password);
[DispId(2)]
bool ExecuteSelectCommand( selCommand);
[DispId(3)]
bool NextRow();
[DispId(4)]
void ExecuteNonSelectCommand( insCommand);
[DispId(5)]
GetColumnData( pos);
}
  COM事件接口: // 事件接口Database_COMObjectEvents
[Guid(\";47C976E0-C208-4740-AC42-41212D3C34F0\";),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public erface DBCOM_Events
{
}
  下面是实际类定义:
[Guid(\";9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E\";),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public DBCOM_Class : DBCOM_Interface
{
  需要注意在类前面需要设置下面特性:
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
  ClassInterfaceType.None表示没有为该类生成类接口如果没有明确地实现接口类只能通过IDispatch提供后期绑定访问用户希望通过明确地由类实现接口使外部对象能够访问类功能这也是推荐ClassInterfaceAttribute设置
  ComSourceInterfaces(typeof(DBCOM_Events))]确定许多作为COM事件向外部对象提供接口在本文例子中我们不对外部对象开放任何事件
  下面是COM对象完整源代码:
using
using .Runtime.InteropServices;
using .IO;
using .Text;
using .Data.SqlClient;
using .Windows.Forms ;
Database_COMObject
{
[Guid(\";694C1820-04B6-4988-928F-FD858B95C880\";)]
public erface DBCOM_Interface
{
[DispId(1)]
void Init( userid , password);
[DispId(2)]
bool ExecuteSelectCommand( selCommand);
[DispId(3)]
bool NextRow();
[DispId(4)]
void ExecuteNonSelectCommand( insCommand);
[DispId(5)]
GetColumnData( pos);
}
// 事件接口Database_COMObjectEvents
[Guid(\";47C976E0-C208-4740-AC42-41212D3C34F0\";),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public erface DBCOM_Events
{
}

[Guid(\";9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E\";),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public DBCOM_Class : DBCOM_Interface
{
private SqlConnection myConnection = null ;
SqlDataReader myReader = null ;
public DBCOM_Class()
{
}
public void Init( userid , password)
{
try
{
myConnectString = \";user id=\";+userid+\";;password=\";+password+
\";;Database=NorthWind;Server=SKYWALKER;Connect Timeout=30\";;
myConnection = SqlConnection(myConnectString);
myConnection.Open();
MessageBox.Show(\";CONNECTED\";);
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
}
public bool ExecuteSelectCommand( selCommand)
{
( myReader != null )
myReader.Close() ;
SqlCommand myCommand = SqlCommand(selCommand);
myCommand.Connection = myConnection;
myCommand.ExecuteNonQuery();
myReader = myCommand.ExecuteReader();
true ;
}
public bool NextRow()


{
( ! myReader.Read() )
{
myReader.Close();
false ;
}
true ;
}
public GetColumnData( pos)
{
Object obj = myReader.GetValue(pos);
( obj null ) \";\"; ;
obj.() ;
}
public void ExecuteNonSelectCommand( insCommand)
{
SqlCommand myCommand = SqlCommand(insCommand , myConnection);
retRows = myCommand.ExecuteNonQuery();
}
}
}
  在创建COM对象前我们必须向COM Interop注册该对象右击方案管理器中工程名字点击快捷菜单上“属性”选项然后再点击“配置”->;“创建”扩展output小节将Register for COM Interop选项值设置为true这样个COM对象就能够和可管理性应用进行交互
  为了使COM对象能够被外部对象类库组合必须有个强名字创建强名字需要用到SN.EXE名字: sn -k Database_COM_Key.snk
打开AssemblyInfo.cs并修改下面内容:
[assembly: AssemblyKeyFile(\";Database_COM_Key.snk\";)]
  创建对象创建对象会生成个可以被导入到可管理性或非可管理性代码中类库
  第 2部分:使用Visual C创建访问COM对象客户端软件Software
  ·使用VC开发环境创建个简单工程
  ·使用#import directive导入类型库
  ·在界面中创建个Smart Poer从接口中执行COM类提供功能确保在应用加载时添加CoInitialize(): CoInitialize(NULL);
Database_COMObject::DBCOM_InterfacePtr p(__uuidof(Database_COMObject::DBCOM_Class));
db_com_ptr = p ;
db_com_ptr->;Init(\";scott\"; , \";tiger\";);
  下面代码对Customers数据库表执行个SQL命令返回给定ID客户信息:
char cmd[1024];
sprf(cmd , \";SELECT COMPANYNAME , CONTACTNAME ,
CONTACTTITLE , ADDRESS FROM CUSTOMERS WHERE CUSTOMERID = \'%s\'\"; , m_id );
const char *p ;
bool ret = db_com_ptr->;ExecuteSelectCommand(cmd);
( ! db_com_ptr->;NextRow() )
_bstr_t mData = db_com_ptr->;GetColumnData(3);
p = mData ;
m_address = (CString)p ;
Tags:  部件不能创建对象 动态创建对象 服务器不能创建对象 创建com对象

延伸阅读

最新评论

发表评论