C#如何创建COM对象? 添加COM引用然后向.Net类一样new一把 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 private AxMediaPlayer.AxMediaPlayer axMediaPlayer1;this.axMediaPlayer1 = new AxMediaPlayer.AxMediaPlayer(); 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工具软件,并选择“注册表格式” 下面是一个范例:using System;using System.Runtime.InteropServices;using System.IO;using System.Text;using System.Data.SqlClient;using System.Windows.Forms;namespace Database_COMObject{ /// <summary> /// Class1 的摘要说明。 /// </summary> [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(); } } public class Class1 { public Class1() { // // TODO: 在此处添加构造函数逻辑 // } }} http://www.csharphelp.com/archives/archive281.html这是上面那篇的英文原版 MSDN上的这一篇是最全面的,我相信是我目前看到的.http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkCOMInteropPart1CClientTutorial.asp 如何插入字符 谁能帮我解析一下这个js架构?非常感谢 基于C#与MapX控件实现创建符号图元的问题 datagridView找不到databind方法 单一登录(SSO)问题请教 特殊符号正则表达式 访问大数据量的数据库,出现“超时已过期”的问题,请高手指教! SQL2005问题 如何读取文本文件中每行数据.(一行一行读) 执行插入记录的SQL语句是否可以返回记录吗? 请教微软专员,如何使用License 类对控件和类库进行设计时和运行时授权 简单问题?
this.axMediaPlayer1 = new AxMediaPlayer.AxMediaPlayer();
·类必须是public性质。
·特性、方法和事件必须是public性质的。
·特性和方法必须在类接口中定义。
·事件必须在事件接口中定义。
不是在这些接口中定义的public性质的类成员不能被COM访问,但它们可以被其他的.NET Framework对象访问。要让COM能够访问特性和方法,我们必须在类接口中定义它们,使它们具有DispId属性,并在类中实现这些特性和方法。这些成员定义时的顺序也就是它们在COM中顺序。要让COM访问类中的事件,必须在事件接口中定义这些事件,并赋予它们DispId属性。事件接口不应当由类完成,类只实现类接口(它可以实现不止一个接口,但第一个接口是缺省接口),应当在缺省接口中实现需要让COM访问的方法和特性,方法和特性必须被标识为public性质,并符合在类接口中的定义。需要让COM访问的事件也在缺省的类接口中完成,它们也必须被标识为public性质,并符合事件接口中的定义。
在接口名字之前,每个接口需要一个GUID特性。要生成变个唯一的Guid,需要运行guidgen.exe工具软件,并选择“注册表格式”
下面是一个范例:using System;
using System.Runtime.InteropServices;
using System.IO;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace Database_COMObject
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
[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();
}
}
public class Class1
{
public Class1()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
}
}