抓住COM事件?

时间:2013-09-12 20:07:30

标签: c# .net events com

尝试连接我们用来与.NET中的东西交谈的COM库。在VB6中,只需执行

就可以完成同样的事情
private withevents _monitor as new Application

然后我就可以了

monitor_onPrintText(byval msg as string, byval draw as boolean)

它会工作,只要在显示器一侧打印出某些东西,它就会触发事件并将内容发回给我们。但是,在C#中,我能够执行命令,但是我没有像在VB6中那样得到正常的回报。我只是好奇我做错了什么,就像我读过的所有内容一样

_monitor.onPrintText += onPrintText; 

应该可行,但我无法触发事件。

我已经尝试了this codeproject projectand MSDN以及其他一些资源,但我无法让这个该死的东西上班!以下是代码的基础知识,我已经添加了所有三个"接口"通过导入com对象创建,我尝试了各种不同的组合。我和#34;初创公司"脚本应该返回一个true,并在发布过程中用一些消息触发onPrintText事件几次(或者至少是它在VB6中做的事情......)

using System;
using monitorLib;

public class MyClass 
{
    private Application _monitor;

    public MyClass()
    {
        _monitor = new Application;
        _monitor.onPrintText += onPrintText;

        // Doing this runs a "script" which causes the 
        // event to fire whenever print is called from it.
        _monitor.evaluate("run(\"startup\");"); 
    }


    public dynamic Evaluate(string pScript)
    {
        return _monitor.evaluate(pScript);
    }

    public void PrintText(string p_text, bool p_drawNow)
    {
        debug.print(p_text);
    }
}

2 个答案:

答案 0 :(得分:3)

  public class MyClass : IApplication, IApplicationEvents, IApplicationEvents_Event

这里出了点问题。也许这是故意的,但这是值得怀疑的。实现接口的是服务器客户端只是使用它们。您已经编写了服务器需要编写的代码类型。它必须实现服务器提供的所有接口。但MyClass肯定看起来像仅使用服务器的客户端代码。

不确定你是如何进入这个泡菜的,也许你总是编写服务器而不是客户端代码。另一种可能的解释是COM允许服务器实现生成事件的多个接口。不是你可以在C#中做的事情。为了获得成功,您必须删除所有这些继承的接口,以及为实现它们而编写的代码。然后尝试:

public MyClass() {
    _monitor = new Application();
    _monitor.onPrintText += onPrintText;
}

正如你通常所写的那样。如果事件未通过默认[source]接口实现,那么您可能必须写:

public MyClass() {
    _monitor = new Application;
    var source = (IApplicationEvents_Events)_monitor;
    source.onPrintText += onPrintText;
}

但这只是猜测,我看不到你在对象浏览器中看到的内容。它现在无法正常工作,您最终会听到自己的事件。

答案 1 :(得分:1)

将您的COM组件与其他任何库或第三方软件一样考虑。

COM的接口将用于扩展组件的功能。如果您只是尝试向组件发送信息或从组件获取信息,则不需要它们。

如果您只是尝试获取或发送信息到COM组件,您的代码看起来不错。

你需要:

  1. 从类声明中删除所有接口。
  2. 删除IApplicationEvents_onPrintTextEventHandler方法。
  3. COM控件的引用添加到项目中,然后将其实例化为任何类型。
  4. (提示:Application很可能不是你控制的类型)

    只要此控件有一个名为onPrintText的事件和一个名为evaluate的方法,那么你就可以调用它们了。