软件集成接口.COM组件交互(2)
2017-11-02 13:20
134 查看
如果没有必要,我是真的不想在C#中玩COM组件,原因很多,其中一条是它的效率不高。
C#调用COM组件是很简单的事情,但C#中似乎不能直接引用C#写的COM组件(这可能真叫脱了裤子放屁)。
C#写的COM组件,绝大多数情况是给“旧时代的语言”用的,很不幸,我经常接触到这种“旧时代的语言”。
过程:
1.新建一个C#的类库工程(我没试过用C#生成EXE的COM服务)
2.写一个接口,定义COM组件对象方法:
[ComVisible(true)]
[Guid("44E5D2FC-8E64-4b13-8600-EF87F2669FB2")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IStartAction
{
[DispId(8184)]
void doSomething(ref String data);
[DispId(8180)]
Object OnWriteback { get; set; }
}
说明:
1)如果需要对调用者可见,那么就需要加上[ComVisible(true)],但我不建议全局定义它(AssemblyInfo.cs)
2)GUID用VS中的工具生成
3)DispId可以自己随便写,但在C++响应COM事件的时候,可能会用到
4)OnWriteback是一个属性,主要用于接收VBS中的GetRef,因为VBS中某些情况下无法使用连接点来响应COM事件
3.再写一个接口,定义COM组件事件:
[ComVisible(true)]
[Guid("8D1B96E5-73A3-4d23-A940-B36327790B7B")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IStartEvents
{
[DispId(8180)]
void doBackevent(ref String data);
}
public delegate void StartHandler(ref String data);
4.写一个类,实现COM组件对象
[ComVisible(true)]
[Guid("08E5B21E-4389-47ab-990B-109F57C8FBF7")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IStartAction))]
[ComSourceInterfaces(typeof(IStartEvents))]
public class Start : IStartAction
{
#region IStartAction 成员
public void doSomething(ref String data)
{
}
private Object onWriteback = null;
public Object OnWriteback { get { return (onWriteback); } set { onWriteback = value; } }
#endregion
#region IStartEvents 事件
public event StartHandler doBackevent;
public void doWriteback(ref String data)
{
if (null != doBackevent)
{
doBackevent(ref data);
}
if (null != onWriteback)
{
onWriteback.GetType().InvokeMember("", BindingFlags.InvokeMethod, null, onWriteback, new Object[] { data });
}
}
#endregion
#region IStartAction 测试
private void doTeststart(ref String data)
{
System.Windows.Forms.MessageBox.Show("data:" + data);
doWriteback(ref data);
System.Windows.Forms.MessageBox.Show("back:" + data);
}
#endregion
}
编译好之后,生成DLL,就是一个COM组件了。注意使用RegAsm注册的时候,要加/tlb参数
如果没有必要,我是真的不想在C#中玩COM组件,原因很多,其中一条是它的效率不高。
C#调用COM组件是很简单的事情,但C#中似乎不能直接引用C#写的COM组件(这可能真叫脱了裤子放屁)。
C#写的COM组件,绝大多数情况是给“旧时代的语言”用的,很不幸,我经常接触到这种“旧时代的语言”。
过程:
1.新建一个C#的类库工程(我没试过用C#生成EXE的COM服务)
2.写一个接口,定义COM组件对象方法:
[ComVisible(true)]
[Guid("44E5D2FC-8E64-4b13-8600-EF87F2669FB2")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IStartAction
{
[DispId(8184)]
void doSomething(ref String data);
[DispId(8180)]
Object OnWriteback { get; set; }
}
说明:
1)如果需要对调用者可见,那么就需要加上[ComVisible(true)],但我不建议全局定义它(AssemblyInfo.cs)
2)GUID用VS中的工具生成
3)DispId可以自己随便写,但在C++响应COM事件的时候,可能会用到
4)OnWriteback是一个属性,主要用于接收VBS中的GetRef,因为VBS中某些情况下无法使用连接点来响应COM事件
3.再写一个接口,定义COM组件事件:
[ComVisible(true)]
[Guid("8D1B96E5-73A3-4d23-A940-B36327790B7B")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IStartEvents
{
[DispId(8180)]
void doBackevent(ref String data);
}
public delegate void StartHandler(ref String data);
4.写一个类,实现COM组件对象
[ComVisible(true)]
[Guid("08E5B21E-4389-47ab-990B-109F57C8FBF7")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IStartAction))]
[ComSourceInterfaces(typeof(IStartEvents))]
public class Start : IStartAction
{
#region IStartAction 成员
public void doSomething(ref String data)
{
}
private Object onWriteback = null;
public Object OnWriteback { get { return (onWriteback); } set { onWriteback = value; } }
#endregion
#region IStartEvents 事件
public event StartHandler doBackevent;
public void doWriteback(ref String data)
{
if (null != doBackevent)
{
doBackevent(ref data);
}
if (null != onWriteback)
{
onWriteback.GetType().InvokeMember("", BindingFlags.InvokeMethod, null, onWriteback, new Object[] { data });
}
}
#endregion
#region IStartAction 测试
private void doTeststart(ref String data)
{
System.Windows.Forms.MessageBox.Show("data:" + data);
doWriteback(ref data);
System.Windows.Forms.MessageBox.Show("back:" + data);
}
#endregion
}
编译好之后,生成DLL,就是一个COM组件了。注意使用RegAsm注册的时候,要加/tlb参数
相关文章推荐
- 软件集成接口.COM组件交互(1)
- 【友盟 社会化组件之一】集成友盟的分享接口(微信、qq、新浪微博)
- 【友盟 社会化组件之二】集成友盟的第三方登录接口(微信、qq、新浪微博)
- 通过人与人的交互,反思软件系统与软件系统之间的集成交互问题
- 应用集成实战系列:服务总线中同步交互服务接口的定义规范
- 通过人与人的交互,反思软件系统与软件系统之间的集成交互问题
- 软件集成接口.序
- 通过人与人的交互,反思软件系统与软件系统之间的集成交互问题
- 吉日嘎拉的梦想 - 做全国最好的后台权限管理系统,提高我们的软件生产率,成为权限标准组件,为软件系统的集成提供咨询服务
- 吉日嘎拉的梦想 - 做全国最好的后台权限管理系统,提高我们的软件生产率,成为权限标准组件,为软件系统的集成提供咨询服务
- 雅虎公布应用接口 第三方软件可以集成其邮箱
- C#.NET 大型企业信息化系统集成快速开发平台 4.1 版本 - 如何才能成为全国知名软件组件
- 吉日嘎拉的梦想 - 做全国最好的后台权限管理系统,提高我们的软件生产率,成为权限标准组件,为软件系统的集成提供咨询服务
- 吉日嘎拉的梦想 - 做全国最好的后台权限管理系统,提高我们的软件生产率,成为权限标准组件,为软件系统的集成提供咨询服务
- 反思软件系统与软件系统之间的集成交互问题
- 通过人与人的交互,反思软件系统与软件系统之间的集成交互问题
- 多软件子系统集成的效果图-通用权限管理系统组件4.0版本
- 通过人与人的交互,反思软件系统与软件系统之间的集成交互问题
- 通过人与人的交互,反思软件系统与软件系统之间的集成交互问题
- 【组件图】软件-系统架构-组件图