powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запуск dll с параметром и обращение к её компонентам
25 сообщений из 26, страница 1 из 2
Запуск dll с параметром и обращение к её компонентам
    #38621644
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня, знатоки!
Потратил немало времени на поиск ответа, но таки не нашёл решения. Очень прошу помочь вас!
Ситуация следующая:

Есть Dll, В ней форма

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
namespace ClassLibrary1
{
    public partial class Form1 : Form
    {
        public const int _Id = 6;
        public const string field1 = "1";
        public const string field2 = "2";
        public const string field3 = "3";

        public Form1()
        {
            InitializeComponent();
            label1.Text = _Id.ToString() + field1 + field2 + field3;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            MessageBox.Show(field1 + field2 + field3);
        }
    }
}



Есть второй проект: простая форма с кнопкой. По клику на которую:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private void button1_Click(object sender, EventArgs e)
        {
            Assembly testAssembly = Assembly.LoadFrom("ClassLibrary1.dll");

            Type curType = null;
            foreach (Type type in testAssembly.GetTypes())
            {
                if (type.IsClass)
                {
                    curType = type;
                }
            }
            Form form = (Form)Activator.CreateInstance(curType);
            form.ShowDialog(); // Or Application.Run(form)
        
        }



Как я могу получить доступ к полям filed1..3 класса Form1?
Как при создании Form1 в неё передать, например, строку подключения?

Суть в том, что Dllки будут подключаться по ходу выполнения программы, т.е. заранее я не могу добавить референс на неё. Само собой у всех Dll имена параметров и методов будут одинаковые.

Приветствуется указания "тегов" чего гуглить и учить.
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38621715
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Везде все добавляют референс. А у меня так не получается. Вот и не могу найти информацию как делать это динамически.
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38621730
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.,
наводящий вопрос, Вы знаете что такое Интерфейсы, Атрибуты, ну на худой конец рефлексия?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38621741
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интерефейсы да, Аттрибуты и Рефлексия нет.

Я правильно понял что нужно начать с создания интерфейма для всех DLl?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38621796
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.,

может тебе нужен mef ?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38621925
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

После беглого просмотря стало ясно что мне всё равно нужно начать с аттрибутов и рефлексии ) Ну что ж. Да поможет мне Троелсен )
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38622181
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тех работает над подобной проблемой: У Троелсена в книге C# 5.0, то что мне надо называется позднее связывание.
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38622184
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.У Троелсена в книге C# 5.0, то что мне надо называется позднее связывание.
не лучшее решение
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38622275
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
Посоветуете чтото другое?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38622281
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.Я правильно понял что нужно начать с создания интерфейма для всех DLl?
правильно
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38622297
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Тогда почему позднее связывание плохое решение? Я так понял надо Dll создвать на основе какого-то интерфейса, но подключаются они всё равно при помощи позднего связывания. Или я не так чтото понял?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38622310
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.,
вы подключаете длл, вам про нее не известно ничего, что в ней лежит и как, что бы исследовать ее вам нужна рефлексия
ваш код что вы привели - улыбнуло..
что бы еще более плодотворно работать, не заостряя внимание на реализации типов, вам понадобится что то общее - интерфейсы
предположу что будут лежать в другой длл ( если они кастомные) или задействовать из тех что имеет net, для быстрого поиска
и маркировки элементов можно применить атрибуты, ну тут длл посредника для них желательно, ими можно маркировать
хоть что, можно в подключаемой длл замаркировать сборку атрибутом с указанием типа формы на вызов, а после подключения
проверить наличие атрибута и если есть прямо из атрибута вызвать экземпляр формы, диапазон эквилибристики безграничен...
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38623860
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу пока осознать всего что вы написали по поводу посредника и т.д.
У меня получается вот такая штука
Ещё раз повторю задачу на всякий случай: С главным ЕХЕ может лежать произвольное кол-во ДЛЛ. При загрузке ЕХЕ собирает список этих ДЛЛ и по кнопке загружает выбранную. Каждая ДЛЛ должна отрисовывать свою форму+на главной форме (которая вызывает ДЛЛ) менять некоторые контролы.

На данный момент я делаю вот так:
Сделал интерфейс и аттрибут к нему:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    [ReportDll]
    interface IReportable
    {
        //SqlConnection Connection { get; }

        
        ReportsType ReportsType { get; }

        string ReportsGroup { get; }
        string ReportName { get; }
        int ReportId { get; }

        void PrepareParams(FlowLayoutPanel flpParams);
        void Generate();

    }
    public enum ReportsType {Отчёты, Справочники}

    public class ReportDllAttribute : Attribute
    {
        
    }



Вот так реализует его сама форма:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
  public partial class Form1 : Form, IReportable
    {
        public ReportsType ReportsType
        {
            get { return ReportsType.Справочники; }
        }
        public string ReportsGroup
        {
            get { return "Производство"; }
        }
        public string ReportName
        {
            get { return "Клиенты"; }
        }
        public int ReportId
        {
            get { return 6; }
        }

        public SqlConnection Connection;

        public void PrepareParams(FlowLayoutPanel flpParams)
        {            
            Form1_Load(null, null);
            CheckBox c = new CheckBox();
            flpParams.Controls.Add(c);
        }

        public void Generate()
        {
            
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

    }



Ну и запускаю вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            Assembly testAssembly = Assembly.LoadFrom("ClassLibrary1.dll");

            var t = testAssembly.GetTypes();
            Type mytype = testAssembly.GetType("ClassLibrary1.Form1");
            object myobj = Activator.CreateInstance(mytype);

            var t3 = mytype.GetFields();
            var t2 = mytype.GetMethods();
            MethodInfo mymethod = mytype.GetMethod("Prepare2");
            mymethod.Invoke(myobj, new object[] {flowLayoutPanel1});



Само собой это пока тестово-тренировочный вариант.

Вопросы:
- Я правильно иду? Что надо менять?
- Как выбрать из корневой папки все ДЛЛ с аттрибутом [ReportDll]?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38623878
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.,
идете прально но усложним задачу Type mytype = testAssembly.GetType("ClassLibrary1.Form1");
мы не знаем названий типов и как они лежат ~ ClassLibrary1.Form1
покажу один трюк
нам понадобится сборка доступная всем сборкам которые оперируют в системе
там будем держать атрибуты для сборок и интерфейсы
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 namespace Диспетчер
{
    [AttributeUsageAttribute(AttributeTargets.Assembly,  AllowMultiple = true)]
    public class FormAttribute:Attribute
    {
        private readonly Type _form;
        public FormAttribute(Type form)
        {
            _form = form;
        }
        public object FormInstance(string str)
        {
          return  Activator.CreateInstance(_form, str);
        }
        public object FormInstance()
        {
            return Activator.CreateInstance(_form);
        }
    }
}


тут в общем атрибут для подписывания сборки, который содержит тип который нам надо вызывать из атрибута.
ну коль у вас формы с конструктором параметризованным, добавил перегрузку
теперь как пользоваться им.
Берем длл с формой которую нам надо вызывать, и рефрендим к ней сборку с атрибутом
ну и сама сборка
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
[assembly: Диспетчер.Form(typeof(ItemDll.MyForm))]
namespace ItemDll
{
    public class MyForm:Form
    {
        public MyForm(string str)
        {
            Text = str;
        }
        public MyForm()
        {
            Text = "nooo";
        }
        public override sealed string Text
        {
            get { return base.Text; }
            set { base.Text = value; }
        }
    }
}


я ее подписал атрибутом, и назначил тип для вызова
ну и сам вызов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 private void button1_Click(object sender, EventArgs e)
        {
            Assembly testAssembly = Assembly.LoadFrom("ItemDll.dll");
            var atr = testAssembly.GetCustomAttributes(typeof(FormAttribute), true);
            if (atr.Any())
            {
                ((Form)((FormAttribute)atr.First()).FormInstance("ssdfsdfgggggggggggggggggggggggggggggggg")).ShowDialog();
            }
        }


то что я показал - что бы мозги жирком не затягивало, а так то вариантов вызова - ну очень хватает...
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38624162
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.,

задача учебная или боевая?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625161
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Вообще боевая. Но для меня и учебная. Учитывая что сроки горят - делаю без промежуточной сборки дабы не усложнять. Тем более проект достаточно внутренний и поддержки чего-то от стороннего производителя не потребуется. Главное общий вектор определён! А то этого я вообще не знал с какой стороны подходить к задаче
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625194
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите ещё, пожалуйста, решение вот какой задачи:
Вот я из ДЛЛ открываю форму. Всё хорошо, но мне надо чтобы она вписала с контроль (к примеру панель) вызывающего приложения. Как это лучше реализовать?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625206
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КОрректриовка вопроса:
Правильнее чтобы это делала родительская форма (та которая вызывает ДЛЛ) или в ДЛЛ передать контрол и как-то его вписывать в него. Есто второй вариант, то как? Первый я реализовал.
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625323
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.,
События?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625399
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.КОрректриовка вопроса:
Правильнее чтобы это делала родительская форма (та которая вызывает ДЛЛ) или в ДЛЛ передать контрол и как-то его вписывать в него. Есто второй вариант, то как? Первый я реализовал.
в плагин передай контрол(контейнер), в плагине добавляй содержимое
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625480
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

А если плагин может отрисовываться на любом контроле (к примеру перекрыть собой грид)?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625483
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovАлексей Ку.,
События?

Например? Не очень понял как сюда привязать события.
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625487
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.Изопропил,

А если плагин может отрисовываться на любом контроле (к примеру перекрыть собой грид)?
вопрос то в чём?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625494
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Ну грид ведь не может быть контейнером для кнопок?
...
Рейтинг: 0 / 0
Запуск dll с параметром и обращение к её компонентам
    #38625514
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.Alex KuznetsovАлексей Ку.,
События?

Например? Не очень понял как сюда привязать события.Да, это я не поняв вопроса предположил, что нужно передать данные из плагина в какой-то контрол контейнера...

IMHO, плагинная архитектура не предполагает передачу компонентов в плагин, иначе это нонсенс какой-то получается.

Вы бы хоть в общих чертах обрисовали (ну или схематично нарисовали) то что собираетесь делать.
Понятно, что собираетесь делать плагинные формочки и их куда-то вставлять.
А зачем в них помещать ещё какие-то контролы с формы контейнера?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запуск dll с параметром и обращение к её компонентам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]