【问题标题】:Subscribe to event in dll from another application从另一个应用程序订阅 dll 中的事件
【发布时间】:2015-10-22 15:19:29
【问题描述】:

我一直在寻找可能的解决方案,但似乎没有一个能接近我真正需要的。我有一个输出到类库 (dll) 的 Windows 窗体。我将此 dll 引用到控制台应用程序中,然后在 dll 中启动 GUI。我希望能够订阅控制事件并在我的控制台应用程序中执行任何代码。 当我想直接从我的控制台应用程序读取或写入 dll 中的属性时,我没有问题。示例:

MyDll.MyClass myObj = new MyDll.MyClass();
myObj.Textbox1.Text = "Hello World!";

但是,我想订阅我的 dll 中的 TextChanged 事件并将新文本输出到我的控制台应用程序。大致如下:

public void textbox1_TextChaned(object sender, EventArgs e)
{
    Console.WriteLine(myObj.textbox1.Text);
}

有没有办法直接订阅该事件?还是其他事件?

【问题讨论】:

    标签: c# events dll delegates handler


    【解决方案1】:
    1. textbox1的修饰符设置为public

    2. 订阅TextChanged事件:

      myObj.Textbox1.TextChanged += textbox1_TextChaned;

    控制台应用程序中的以下代码适用于我。我引用的是 Windows 窗体应用程序而不是 DLL,但我认为应该没有太大区别:

     class Program
      {
        static WindowsFormsApplication1.Form1 frm;
        static void Main(string[] args)
        {
          frm = new WindowsFormsApplication1.Form1();
          frm.textBox1.TextChanged += textBox1_TextChanged;
          System.Windows.Forms.Application.Run(frm);
    
        }
        static void textBox1_TextChanged(object sender, EventArgs e)
        {
          Console.WriteLine((frm.textBox1.Text));
        }
      }
    

    【讨论】:

    • 感谢您的快速回复。我已经试过了。似乎控制台应用仍未订阅。
    • 要清楚你的textbox1_TextChaned 在你的控制台程序中吗?
    • 是的,frm = new Gui();应用程序.运行(frm); frm.TextChanged += new EventHandler(txtInput_TextChanged);公共静态无效txtInput_TextChanged(对象发送者,EventArgs e){Console.WriteLine(frm.txtINPUT.Text); }
    • @GeMaths 我想我看到了问题所在。您正在订阅Run(frm) 之后的活动。在您的表单关闭之前,该行不会完成。将订阅移到该行上方。
    • 我不敢相信我错过了这么简单的东西!您先生,刚刚为我节省了数小时的调试时间。度过美好的一天。
    【解决方案2】:

    这并不能直接回答您的问题,但它会以更简洁的方式解决您的问题,IMO。

    1. 在您的 DLL 中定义一个接口 (IEventProcessor)。
    2. 在您的控制台中 应用程序实现接口(ConsoleEventProcessor)。
    3. 通过表单的构造函数传递一个实例
    4. 从表单中的事件调用它的方法。

    在控制台应用程序中:

    IEventProcessor processor = new ConsoleEventProcessor();    
    MyDll.MyClass myObj = new MyDll.MyClass(processor);
    

    然后是形式:

    IEventProcessor _processor;
    // constructor
    public MyClass(IEventProcessor processor)
    {
       _processor = processor;
    }
    
    public void textbox1_TextChaned(object sender, EventArgs e)
    { 
        // pass whatever parameters you need to use in the method
        _processor.ProcessText1Changed(textbox1.Text);
    }
    

    【讨论】:

    • 优秀的方法!非常感谢。
    • 我假设 Process.Text1Changed(string s) 在控制台应用程序中实现为 void ProcessText1Changed(string s) { Console.Write(s); } 我是对的吗?
    • 是的,你是对的。另外,请注意,您可以定义此方法所需的任何参数和返回值。我的签名只是一个例子。
    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多