尝试连接我们用来与.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 project,and 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);
}
}
答案 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
组件,您的代码看起来不错。
你需要:
IApplicationEvents_onPrintTextEventHandler
方法。 COM
控件的引用添加到项目中,然后将其实例化为任何类型。 (提示:Application
很可能不是你控制的类型)
只要此控件有一个名为onPrintText
的事件和一个名为evaluate
的方法,那么你就可以调用它们了。