事件注册的回调函数不能执行。分少了点,但问题很费解,求救

yunhaiC QQ654777694 2012-04-19 01:57:32
我的GUI在调用dll里面的一个方法HandControlValve7_Value()的时候,这个方法里面注册了一个事件。回调函数也是在这个dll里面写的,为什么回调函数无法触发?


public class dllTest
{
public AxActQJ71E71TCP PlcSocket = null;

public dllTest(ref AxActQJ71E71TCP _PlcSocket)
{
PlcSocket = _PlcSocket;
}

public override bool HandControlValve7_Value()
{
this._szDevice = "D136";
eData = new int[4] { 1, 2, 3, 4 };
int iRet = PlcSocket.EntryDeviceStatus(this._szDevice,1, 1, ref _eData[0]);
PlcSocket.OnDeviceStatus += new _IActQJ71E71TCPEvents_OnDeviceStatusEventHandler(PlcSocket_OnDeviceStatus);

return false;
}

public void PlcSocket_OnDeviceStatus(object sender, _IActQJ71E71TCPEvents_OnDeviceStatusEvent e)
{
if (e.szDevice == "D136")
{
PlcSocket.FreeDeviceStatus();
}
}



接下来,我新建一个项目,引用这个dll,窗口上添加一个按钮,这样写


public AxActQJ71E71TCP GuiPlcSocket = new AxActQJ71E71TCP();

private void button3_Click(object sender, EventArgs e)
{
dllTest dlltst = new dllTest(ref GuiPlcSocket );
dlltst.HandControlValve7_Value();
}


好,我调用了这个方法HandControlValve7_Value(),注册了事件,但是事件PlcSocket_OnDeviceStatus没有执行。

大家不要怀疑代码编写问题以及事件触发问题。如果我把dll里面代码注册GuiPlcSocket 事件放在新建的项目中,只要我注册成功了,事件就能被触发。这个事件是由硬件触发的。

我不太明白,为什么在外面的GUI项目可以触发,而把注册事件与回调函数放在dll里面,成功注册,但是回调函数不能执行?
...全文
270 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnwin 2012-04-20
  • 打赏
  • 举报
回复
贴段代码:这是我自定义(扩展)的TextBox,在里面加了按钮,为了在应用程序里可以写该按钮的点击事件处理过程,在该控件类内定义了ButtonClick事件(EventHandler)

public partial class TextBoxEx : TextBox
{
public event EventHandler ButtonClick;
private void InitializeComponent()
{
...
this.BtnSelect = new System.Windows.Forms.Button();

this.BtnSelect.Click += new System.EventHandler(this.OnButtonClick);
this.Controls.Add(this.BtnSelect);

this.ResumeLayout(false);

}
protected virtual void OnButtonClick(object sender, EventArgs e)
{
if (ButtonClick != null) ButtonClick(this, e);
}

}


这样应用程序里就可以写其事件处理程序了:

private void Form1_Load(object sender, EventArgs e)
{
this.textBoxEx1.ButtonClick += new System.EventHandler(this.textBoxEx1_ButtonClick);
}
private void textBoxEx1_ButtonClick(object sender, EventArgs e)
{
this.Text = textBoxEx1.Text;
}
hdt_mj 2012-04-20
  • 打赏
  • 举报
回复
注意对象的生存期
cnwin 2012-04-20
  • 打赏
  • 举报
回复
我觉得你的代码有问题。
首先,注册事件响应不是在你的类内部,而是应用程序那边的事。比如TextBox的TextChanged事件处理过程,是在应用程序里而不是在TextBox控件类内,其内倒是有个TextChanged事件(EventHandler),当然为了类扩展。一般类内激发这个事件往往是通过Protected override所修饰的方法来激发的。
  • 打赏
  • 举报
回复
求救~~~~~~~~~~~~~~~~~~~
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

我不是说了吗,如果你认为底层没问题,那就从你自己代码去找问题。如果你认为你的代码和类库都没有问题,那就是微软有问题。不过我始终相信问题还是出在你自己身上,只是不在你给的这部分代码中。
[/Quote]

我就是来搞清楚问题啊,底层代码,微软代码不用怀疑,我的代码就这么多现在,就想知道原因啊,我始终在想是否回调函数写在dll里面是执行不了的
cheng2005 2012-04-19
  • 打赏
  • 举报
回复
我不是说了吗,如果你认为底层没问题,那就从你自己代码去找问题。如果你认为你的代码和类库都没有问题,那就是微软有问题。不过我始终相信问题还是出在你自己身上,只是不在你给的这部分代码中。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
从你给的代码是没法来判断问题的,你给的这部分代码是没什么问题的,你对AxActQJ71E71TCP 的事件和方法的具体内容一无所知,如果你一定要说自己没有其它代码处理这个东西,那只能假设AxActQJ71E71TCP 有问题。
[/Quote]

你的假设不成立,人家已经执行有效了,只是在类项目里面无效.
人家封装好的库,我怎么可能对他了解,你这说话不现实,对于人家封装好的库来我,只有说明手册,没有开发手册
cheng2005 2012-04-19
  • 打赏
  • 举报
回复
从你给的代码是没法来判断问题的,你给的这部分代码是没什么问题的,你对AxActQJ71E71TCP 的事件和方法的具体内容一无所知,如果你一定要说自己没有其它代码处理这个东西,那只能假设AxActQJ71E71TCP 有问题。
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

我知道你是什么意思,假设这个事件一直都可以被正常的触发,那么你说的情况只有一种解释,就是你的代码有问题,而你不把完整的代码贴出来,怎么能看出哪有问题。

Class A
{
pubic int x = 0;
pubic void SetX(int m)
{
x = m;
}
}


A a= new A();
a.SetX(10);
为什么有可能x不是10呢?
……
[/Quote]
我已经把我的代码提炼出来了,整个代码结构就是这样的,没有其他东西
cheng2005 2012-04-19
  • 打赏
  • 举报
回复
我知道你是什么意思,假设这个事件一直都可以被正常的触发,那么你说的情况只有一种解释,就是你的代码有问题,而你不把完整的代码贴出来,怎么能看出哪有问题。

Class A
{
pubic int x = 0;
pubic void SetX(int m)
{
x = m;
}
}


A a= new A();
a.SetX(10);
为什么有可能x不是10呢?
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

给出一段不明不白的代码,别人没法调试,看代码也不会有错,这种问题别人能解决就怪了。
AxActQJ71E71TCP.OnDeviceStatus 这个事件到底是什么时候会触发我问你,你知道吗?你有办法确认这个事件一定被触发了吗?

我对分层什么的不关心,我关心的是,你是怎么知道无法触发的?

你一直在强调自己的代码绝对没问题,那么我想说,如果你的代码没问题就是Framework的代码有……
[/Quote]

我在Windows窗体应用程序里面,我把注册事件,回调都在好,是可以触发的,至于他怎么触发的,那是硬件问题,但是为什么放在类库里面做了同样的代码,不能触发?我是这个意思
cheng2005 2012-04-19
  • 打赏
  • 举报
回复
给出一段不明不白的代码,别人没法调试,看代码也不会有错,这种问题别人能解决就怪了。
AxActQJ71E71TCP.OnDeviceStatus 这个事件到底是什么时候会触发我问你,你知道吗?你有办法确认这个事件一定被触发了吗?

我对分层什么的不关心,我关心的是,你是怎么知道无法触发的?

你一直在强调自己的代码绝对没问题,那么我想说,如果你的代码没问题就是Framework的代码有问题,比起你来,我更愿意相信微软的代码是没问题的。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

首先,我不知道AxActQJ71E71TCP.OnDeviceStatus 这个事件是什么东西,是怎么触发的,只是听你说是由硬件触发的。
-----------你根本不需要知道他是什么,很明摆OnDeviceStatus不就是AxActQJ71E71TCP类里面的事件吗?

其次,我不知道你所谓的写在新建项目中,能被触发是什么意思。
----------------分层呗,那个是通讯层,在类项目里面,我的是GUI层,在Windows窗体应用程序里面。如果注册事件与回调函数都在Windows窗体应用程序里面,那是可以触发回调函数的。如果在类项目里面,即使注册成功也是触发不了的

最后,仅从你现在提供的这些信息,只能推断出一种可能,你两种处理方法一定是多底层产生了影响。最大的可能就是你在某处有PlcSocket.OnDeviceStatus -= new _IActQJ71……
-----------这点你就不用怀疑了,我下次再调用HandControlValve7_Value()他的事件是已经被注册过的,我debug看到的
[/Quote]
cheng2005 2012-04-19
  • 打赏
  • 举报
回复
首先,我不知道AxActQJ71E71TCP.OnDeviceStatus 这个事件是什么东西,是怎么触发的,只是听你说是由硬件触发的。
其次,我不知道你所谓的写在新建项目中,能被触发是什么意思。
最后,仅从你现在提供的这些信息,只能推断出一种可能,你两种处理方法一定是多底层产生了影响。最大的可能就是你在某处有PlcSocket.OnDeviceStatus -= new _IActQJ71E71TCPEvents_OnDeviceStatusEventHandler(PlcSocket_OnDeviceStatus);或者类似的解除事件的操作(或者调用了会解除事件的方法)

总结的一句就是,事件这东西触发不触发跟你写在哪一定没关系,请仔细检查自己的代码。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

你给的不是说不能触发的情况吗?

你说能触发的情况你是怎么做的。
[/Quote]

大家不要怀疑代码编写问题以及事件触发问题。如果我把dll里面代码注册GuiPlcSocket 事件放在新建的项目中,只要我注册成功了,事件就能被触发。这个事件是由硬件触发的。
cheng2005 2012-04-19
  • 打赏
  • 举报
回复
你给的不是说不能触发的情况吗?

你说能触发的情况你是怎么做的。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

如果我把dll里面代码注册GuiPlcSocket 事件放在新建的项目中,只要我注册成功了,事件就能被触发。这个事件是由硬件触发的。


这是怎么写,看看。
[/Quote]
已经写完了,就这样啊
cheng2005 2012-04-19
  • 打赏
  • 举报
回复
如果我把dll里面代码注册GuiPlcSocket 事件放在新建的项目中,只要我注册成功了,事件就能被触发。这个事件是由硬件触发的。


这是怎么写,看看。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧