1

试图连接一个我们用来与 .NET 中的事物对话的 COM 库。在 VB6 中,同样的事情可以通过做

private withevents _monitor as new Application

然后我可以做

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

它会起作用,只要在监视器端打印了一些东西,它就会触发事件并将东西发回给我们。但是,在 C# 中,我能够执行命令,但我没有像在 VB6 中那样恢复正常。我只是好奇我做错了什么,正如我所读到的一切

_monitor.onPrintText += onPrintText; 

应该可以工作,但是我无法触发该事件。

我已经尝试过这个 codeproject 项目MSDN以及一堆其他资源,但我无法让这该死的东西工作!这是代码的基础,我添加了通过导入 com 对象创建的所有三个“接口”,并且尝试了各种不同的组合。我的“启动”脚本应该返回一个真值,并触发 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);
    }
}
4

2 回答 2

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;
}

但这只是一个猜测,我看不到您在对象浏览器中看到的内容。它现在不起作用是意料之中的,你最终听了自己的事件。

于 2013-09-12T21:18:09.480 回答
1

COM像考虑任何其他库或 3rd 方软件一样考虑您的组件。

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

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

你需要:

  1. 从类声明中删除所有接口。
  2. 删除IApplicationEvents_onPrintTextEventHandler方法。
  3. 将控件的引用添加COM到项目中,然后将其实例化为任何类型。

(提示:Application很可能不是您的控件类型)

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

于 2013-09-12T21:26:22.487 回答