知识大全 用C#创建COM对象
Posted 知
篇首语:亦余心之所善兮,虽九死其犹未悔。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用C#创建COM对象相关的知识,希望对你有一定的参考价值。
用C#创建COM对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在本篇文章中 我们将讨论下面的问题 ·使用C#创建一个简单的对象(使用的Interop特性) ·从VC++客户端软件中访问 客户端软件使用了TypeLibrary( TLB文件) 为了简单和方便开发人员使用 测试起见 我们使用了SQLSERVER数据库软件的缺省安装中的Northwind数据库 ·修改对象中SQLServer的名字 与SQLServer连接 ·我们已经创建了连接数据库用的分别为scott tiger的用户名和口令 我们可以使用它或者其他现有的用户名和口令 第一部分 用C#创建简单的对象 对象是ClassLibrary类 它生成DLL文件 要在VS开发环境中创建一个简单的对象 我们可以依次选择 文件 > 新创建 > 工程 > VisualC#工程 > 类库 然后创建一个名字为Database_Object的工程需要注意的是 在中调用VC#对象需要下面的条件 ·类必须是public性质 ·特性 方法和事件必须是public性质的 ·特性和方法必须在类接口中定义 ·事件必须在事件接口中定义 不是在这些接口中定义的public性质的类成员不能被访问 但它们可以被其他的 NET Framework对象访问 要让能够访问特性和方法 我们必须在类接口中定义它们 使它们具有DispId属性 并在类中实现这些特性和方法 这些成员定义时的顺序也就是它们在中顺序 要让访问类中的事件 必须在事件接口中定义这些事件 并赋予它们DispId属性 事件接口不应当由类完成 类只实现类接口(它可以实现不止一个接口 但第一个接口是缺省接口) 应当在缺省接口中实现需要让访问的方法和特性 方法和特性必须被标识为public性质 并符合在类接口中的定义 需要让访问的事件也在缺省的类接口中完成 它们也必须被标识为public性质 并符合事件接口中的定义 在接口名字之前 每个接口需要一个GUID特性 要生成变个唯一的Guid 需要运行guidgen exe工具软件 并选择 注册表格式 下面是一个类界面
[Guid( C B F FD B C )] public interface DB_Interface [DispId( )] void Init(string userid string password); [DispId( )] bool ExecuteSelectCommand(string selCommand); [DispId( )] bool NextRow(); [DispId( )] void ExecuteNonSelectCommand(string insCommand); [DispId( )] string GetColumnData(int pos);
事件接口 // 事件接口Database_ObjectEvents [Guid( C E C AC D C F ) InterfaceType(ComInterfaceType InterfaceIsIDispatch)] public interface DB_Events
下面是实际的类定义
[Guid( E E FB D ee AB E DBED E E ) ClassInterface(ClassInterfaceType None) ComSourceInterfaces(typeof(DB_Events))] public class DB_Class : DB_Interface
需要注意的是 在类的前面 需要设置下面的特性
ClassInterface(ClassInterfaceType None) ComSourceInterfaces(typeof(DB_Events))]
ClassInterfaceType None表示没有为该类生成类接口 如果没有明确地实现接口 类只能通过IDispatch提供后期绑定访问 用户希望通过明确地由类实现的接口使外部对象能够访问类的功能 这也是推荐的ClassInterfaceAttribute的设置 ComSourceInterfaces(typeof(DB_Events))]确定许多作为事件向外部对象提供的接口 在本文的例子中 我们不对外部对象开放任何事件
下面是对象完整的源代码
using System; using System Runtime InteropServices; using System IO; using System Text; using System Data SqlClient; using System Windows Forms ;
namespace Database_Object [Guid( C B F FD B C )] public interface DB_Interface [DispId( )] void Init(string userid string password); [DispId( )] bool ExecuteSelectCommand(string selCommand); [DispId( )] bool NextRow(); [DispId( )] void ExecuteNonSelectCommand(string insCommand); [DispId( )] string GetColumnData(int pos);
// 事件接口Database_ObjectEvents [Guid( C E C AC D C F ) InterfaceType(ComInterfaceType InterfaceIsIDispatch)] public interface DB_Events
[Guid( E E FB D ee AB E DBED E E ) ClassInterface(ClassInterfaceType None) ComSourceInterfaces(typeof(DB_Events))] public class DB_Class : DB_Interface private SqlConnection myConnection = null ; SqlDataReader myReader = null ;
public DB_Class()
public void Init(string userid string password) try string myConnectString = user id= +userid+ ;password= +password+ ;Database=NorthWind;Server=SKYWALKER;Connect Timeout= ; myConnection = new SqlConnection(myConnectString); myConnection Open(); MessageBox Show( CONNECTED ); catch(Exception e) MessageBox Show(e Message);
public bool ExecuteSelectCommand(string selCommand) if ( myReader != null ) myReader Close() ;
SqlCommand myCommand = new SqlCommand(selCommand); myCommand Connection = myConnection; myCommand ExecuteNonQuery(); myReader = myCommand ExecuteReader(); return true ;
public bool NextRow() if ( ! myReader Read() ) myReader Close(); return false ; return true ;
public string GetColumnData(int pos) Object obj = myReader GetValue(pos); if ( obj == null ) return ; return obj ToString() ;
public void ExecuteNonSelectCommand(string insCommand) SqlCommand myCommand = new SqlCommand(insCommand myConnection); int retRows = myCommand ExecuteNonQuery();
在创建对象前 我们必须向 Interop注册该对象 右击方案管理器中的工程名字 点击快捷菜单上的 属性 选项 然后再点击 配置 > 创建 扩展output小节 将Register for Interop选项的值设置为true 这样 一个对象就能够与可管理性应用程序进行交互 为了使对象能够被外部对象调用 类库组合必须有一个强名字 创建强名字需要用到SN EXE名字 sn k Database__Key snk 打开AssemblyInfo cs 并修改下面一行的内容 [assembly: AssemblyKeyFile( Database__Key snk )]
创建对象 创建对象会生成一个可以被导入到可管理性或非可管理性代码中的类库 第二部分 使用Visual C++创建访问对象的客户端软件 ·使用VC++开发环境创建一个简单的工程 ·使用#import directive导入类型库 ·在界面中创建一个Smart Pointer 从接口中执行类提供的功能 确保在应用程序加载时添加CoInitialize()调用 CoInitialize(NULL); Database_Object::DB_InterfacePtr p(__uuidof(Database_Object::DB_Class)); db__ptr = p ; db__ptr >Init( scott tiger );
下面的代码对Customers数据库表执行一个SQL命令 返回给定ID的客户的信息 char cmd[ ]; sprintf(cmd SELECT PANYNAME CONTACTNAME CONTACTTITLE ADDRESS FROM CUSTOMERS WHERE CUSTOMERID = %s m_id ); const char *p ;
bool ret = db__ptr >ExecuteSelectCommand(cmd);
if ( ! db__ptr >NextRow() ) return ;
cha138/Article/program/net/201311/15785相关参考
知识大全 用FileSystemWatcher对象监控C#目录改变
用FileSystemWatcher对象监控C#目录改变 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
Sandcastle入门:创建C#帮助文档 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用S
C#创建Windows服务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
C#创建简单的验证码操作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先创建一个CLASS类
使用C#创建Windows服务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
C#创建多线程应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在NET和C#中编写一个多
C#创建简单的验证码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs
用C#开发第一个WINDOWS应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一创建工程
C#来创建和读取XML文档 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 扩展标记语言XML(e
C#如何读取和创建INI文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在做项目过程中有时需