Доброго здоровья всем, я извиняюсь — тема наверно истертая, ткните ссылкой если так, вопрос такой:
хочу сделать библиотеку для основной программы (и то и то на С#), схема приблизительно такая: осн.программа при старте инициализирует библиотеку, в ней запускается вызов функций осн.программы по таймеру — получение различных значений и дальнейшая их обработка. Что получилось: создал библиотеку в 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);
}
}
}
Чего еще хочется:
из библиотеки вызвать функцию осн. программы, то есть наоборот от того что получилось, но не пойму как — логично было бы передать при инициализации библиотеки интерфейс осн. программы в библиотеку, что бы стали доступны описанные в этом интерфейсе функции, но как? Дайте пример, пжлст, или ссылкуф
Здравствуйте, 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);
}
Здравствуйте, 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();
}
}
}
По идее, для этого надо написать отдельную библиотеку типа Common.dll, в которой объявить нужный интерфейс. А затем использовать референс этой библиотеки в исходной библиотеке и в самой программе. Ну, а передавать его (интерфейс) обычным образом.
Если нужна просто возможность из DLL вызывать функции осн. приложения или передавать данные, то можно использовать события и делегаты.
Здравствуйте, pugv, Вы писали:
P>Здравствуйте, EvG32, Вы писали:
EG>>передать при инициализации библиотеки интерфейс осн. программы в библиотеку, что бы стали доступны описанные в этом интерфейсе функции, но как?
P>А что мешает?
P>Так и передавайте, интерфейс объявите в библиотеке, а реализующий класс — в приложении.
Разобрался, все ок, код можно прямо вставлять в редактор )
всем большое спасибо, пойду дальше вникать в принципы работы MS