2015-10-22 1 views
0

Я искал все возможное решение, но ни один из них не приблизился к тому, что мне действительно нужно. У меня есть форма окна, которая выводится в библиотеку классов (dll). Я ссылаюсь на эту DLL в консольное приложение, а затем запускаю графический интерфейс в dll. Я хочу, чтобы иметь возможность подписаться на событие управления и делать что-либо код в моем консольном приложении. У меня нет проблем, когда я хочу читать или писать свойства в dll прямо из моего консольного приложения. Пример:Подписаться на событие в dll из другого приложения

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

Однако, я хотел бы подписаться на событие TextChanged в моей DLL и выводить новый текст в моем консольном приложении. Что-то в строках:

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

Есть ли способ подписаться на это мероприятие? или какое-то другое событие?

ответ

1
  1. указан модификатор textbox1 к public

  2. Подписка на TextChanged событие:

    myObj.Textbox1.TextChanged + = textbox1_TextChaned;

Следующий код в приложении консоли работает для меня. Я ссылки на приложение в Windows Forms, а не 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)); 
    } 
    } 
+0

Спасибо за быстрый ответ. Я уже пробовал это. Похоже, консольное приложение все еще не подписывается. – GeMaths

+0

Чтобы быть понятным, является ваш 'textbox1_TextChaned' в вашей консольной программе? – MikeH

+0

Да, frm = new Gui(); Application.Run (frm); frm.TextChanged + = новый EventHandler (txtInput_TextChanged); public static void txtInput_TextChanged (отправитель объекта, EventArgs e) { Console.WriteLine (frm.txtINPUT.Text); } – GeMaths

1

Это не ответ на ваш вопрос прямо, но это решит вашу проблему в аккуратнее путь, ИМО.

  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); 
} 
+0

Отличный aproach! Большое спасибо. – GeMaths

+0

Я предполагаю, что Process.Text1Changed (string s) был реализован в консольном приложении как void ProcessText1Changed (строка s) {Console.Write (s); } Я прав? – GeMaths

+0

Да, вы правы. Кроме того, обратите внимание, что вы можете определить любые параметры и возвращаемое значение, необходимые для этого метода. Моя подпись была всего лишь примером. –