360教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

C# 创建COM对象 C# 创建COM DLL

时间:2022-11-10作者:未知来源:360教程人气:

网络软件一般是指系统的网络操作系统、网络通信协议和应用级的提供网络服务功能的专用软件。网络软件包括通信支撑平台软件、网络服务支撑平台软件、网络应用支撑平台软件、网络应用系统、网络管理系统以及用于特殊网络站点的软件等。从网络体系结构模型不难看出,通信软件和各层网络协议软件是这些网络软件的基础和主体。

 

第一部分:用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工具软件,并选择“注册表格式” 下面是一个类界面:

 

[Guid(";694C1820-04B6-4988-928F-FD858B95C880";)] 
public interface DBCOM_Interface 
{ 
[DispId
(1)] 
void Init
(string userid , string password); 
[DispId
(2)] 
bool ExecuteSelectCommand
(string selCommand); 
[DispId
(3)] 
bool NextRow
(); 
[DispId
(4)] 
void ExecuteNonSelectCommand
(string insCommand); 
[DispId
(5)] 
string GetColumnData
(int pos); 
}

 

  COM事件接口:

 

// 事件接口Database_COMObjectEvents 
[Guid
(";47C976E0-C208-4740-AC42-41212D3C34F0";), 
InterfaceType
(ComInterfaceType.InterfaceIsIDispatch)] 
public interface DBCOM_Events 
{ 
}

 

  下面是实际的类定义:

 

[Guid(";9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E";), 
ClassInterface
(ClassInterfaceType.None), 
ComSourceInterfaces
(typeof(DBCOM_Events))] 
public class DBCOM_Class : DBCOM_Interface 
{

 

  需要注意的是,在类的前面,需要设置下面的特性:

 

ClassInterface(ClassInterfaceType.None), 
ComSourceInterfaces
(typeof(DBCOM_Events))]

 

  ClassInterfaceType.None表示没有为该类生成类接口,如果没有明确地实现接口,类只能通过IDispatch提供后期绑定访问。用户希望通过明确地由类实现的接口使外部对象能够访问类的功能,这也是推荐的ClassInterfaceAttribute的设置。 

  ComSourceInterfaces(typeof(DBCOM_Events))]确定许多作为COM事件向外部对象提供的接口。在本文的例子中,我们不对外部对象开放任何事件。 

  下面是COM对象完整的源代码:

 

using System; 
using System.Runtime.InteropServices
; 
using System.IO
; 
using System.Text
; 
using System.Data.SqlClient
; 
using System.Windows.Forms 
; 

namespace Database_COMObject 
{ 
[Guid
(";694C1820-04B6-4988-928F-FD858B95C880";)] 
public interface DBCOM_Interface 
{ 
[DispId
(1)] 
void Init
(string userid , string password); 
[DispId
(2)] 
bool ExecuteSelectCommand
(string selCommand); 
[DispId
(3)] 
bool NextRow
(); 
[DispId
(4)] 
void ExecuteNonSelectCommand
(string insCommand); 
[DispId
(5)] 
string GetColumnData
(int pos); 
} 

// 
事件接口Database_COMObjectEvents 
[Guid
(";47C976E0-C208-4740-AC42-41212D3C34F0";), 
InterfaceType
(ComInterfaceType.InterfaceIsIDispatch)] 
public interface DBCOM_Events 
{ 
} 


[Guid
(";9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E";), 
ClassInterface
(ClassInterfaceType.None), 
ComSourceInterfaces
(typeof(DBCOM_Events))] 
public class DBCOM_Class : DBCOM_Interface 
{ 
private SqlConnection myConnection = null 
; 
SqlDataReader myReader = null 
; 

public DBCOM_Class
() 
{ 
} 

public void Init
(string userid , string password) 
{ 
try 
{ 
string myConnectString = "
;user id=";+userid+";;password=";+password+ 
"
;;Database=NorthWind;Server=SKYWALKER;Connect Timeout=30";; 
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
(); 
} 

} 
}

 

  在创建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";)]
  创建对象。创建对象会生成一个可以被导入到可管理性或非可管理性代码中的类库。

 


常见的网络操作系统有UNIX、Netware、Windows NT、Linux等,网络软件的漏洞及缺陷被利用,使网络遭到入侵和破坏。



关键词:C# 创建COM对象 C# 创建COM DLL




Copyright © 2012-2018 360教程(http://www.360sd.cn) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版