Снова библиотеки (C#)
От: EvG32  
Дата: 19.03.12 06:51
Оценка:
Доброго здоровья всем, я извиняюсь — тема наверно истертая, ткните ссылкой если так, вопрос такой:
хочу сделать библиотеку для основной программы (и то и то на С#), схема приблизительно такая: осн.программа при старте инициализирует библиотеку, в ней запускается вызов функций осн.программы по таймеру — получение различных значений и дальнейшая их обработка. Что получилось: создал библиотеку в 2008 студии, код:
namespace ClassLibrary1
{
    public interface GetDataInterFace
    {
        int Sum(int x, int y);
    }

    [ClassInterface(ClassInterfaceType.None)]
    public class GetData : GetDataInterFace
    {
        //просто суммируем два числа
        public int Sum(int x, int y)
        {
            return x + y;
        }
    }
}

построил решение, зарегистрировал библиотеку в системе — все ок.
Создал проект "осн. программы" — exe-шник, добавил в него ссылку на библиотеку и без проблем вызвал функции библиотеки, код:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ClassLibrary1.GetData proc = new GetData();
            textBox1.Text = textBox1.Text + proc.Sum(1, 2);
        }

    }
}

Чего еще хочется:
из библиотеки вызвать функцию осн. программы, то есть наоборот от того что получилось, но не пойму как — логично было бы передать при инициализации библиотеки интерфейс осн. программы в библиотеку, что бы стали доступны описанные в этом интерфейсе функции, но как? Дайте пример, пжлст, или ссылкуф
Re: Снова библиотеки (C#)
От: Poul_Ko Казахстан  
Дата: 19.03.12 07:13
Оценка:
Здравствуйте, EvG32, Вы писали:

EG>Чего еще хочется:

EG>из библиотеки вызвать функцию осн. программы, то есть наоборот от того что получилось, но не пойму как — логично было бы передать при инициализации библиотеки интерфейс осн. программы в библиотеку, что бы стали доступны описанные в этом интерфейсе функции, но как? Дайте пример, пжлст, или ссылкуф

Объявите интерфейс для "основной программы" в той же сборке, что и библиотека. Библиотека работает только с этим интерфейсом.
public interface IApplication {}

public class LibClass
{
    public int DoSomething(IApplication app)
    {}
}

В самой основной программе делаете реализацию этого интерфейса и передаёте её в функции библиотеки.
public class App : IApplication {}

public static void Main()
{
   App app = new App();
   LibClass lib = new LibClass();
   lib.DoSomething(app);
}
Brainbench transcript #6370594
Re: Снова библиотеки (C#)
От: pugv Россия  
Дата: 19.03.12 07:14
Оценка:
Здравствуйте, EvG32, Вы писали:
EG>передать при инициализации библиотеки интерфейс осн. программы в библиотеку, что бы стали доступны описанные в этом интерфейсе функции, но как?

А что мешает?
Так и передавайте, интерфейс объявите в библиотеке, а реализующий класс — в приложении.


namespace ClassLibrary1
{
    public interface IMainAppItf {
        void DoWork(int x);
    }

    public interface GetDataInterFace {
        void Init(IMainAppItf app);
        int Sum(int x, int y);
    }

    public class GetData : GetDataInterFace {
        public void Init(IMainAppItf app) {
            _app = app;
        }
        private IMainAppItf _app;
        public int Sum(int x, int y) {
            if (_app != null)
                _app.DoWork(x+y);
            return x + y;
        }
    }
}

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form, IMainAppItf {
        public Form1() {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e) {
            ClassLibrary1.GetData proc = new GetData();
            proc.Init(this);
        }
        public void DoWork(int x) {
            textBox1.Text = x.ToString();
        }
    }
}
Re: Снова библиотеки (C#)
От: Eldar9x  
Дата: 19.03.12 07:14
Оценка: 2 (1) +1
По идее, для этого надо написать отдельную библиотеку типа Common.dll, в которой объявить нужный интерфейс. А затем использовать референс этой библиотеки в исходной библиотеке и в самой программе. Ну, а передавать его (интерфейс) обычным образом.
int i;
i = (i++)+(i++);
cout << i;
Re[2]: Снова библиотеки (C#)
От: 2k9software  
Дата: 19.03.12 09:37
Оценка: +2
Если нужна просто возможность из DLL вызывать функции осн. приложения или передавать данные, то можно использовать события и делегаты.
Re[2]: Снова библиотеки (C#)
От: EvG32  
Дата: 19.03.12 13:46
Оценка:
Здравствуйте, pugv, Вы писали:

P>Здравствуйте, EvG32, Вы писали:

EG>>передать при инициализации библиотеки интерфейс осн. программы в библиотеку, что бы стали доступны описанные в этом интерфейсе функции, но как?

P>А что мешает?

P>Так и передавайте, интерфейс объявите в библиотеке, а реализующий класс — в приложении.

Разобрался, все ок, код можно прямо вставлять в редактор )
всем большое спасибо, пойду дальше вникать в принципы работы MS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.