您的位置:首页 > 编程语言 > C#

软件集成接口.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 接口 集成
相关文章推荐