Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 32

Обратиться к собственной форме из DLL

28.07.2019, 14:06. Показов 2312. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я из другого языка и что-то не могу разобраться с доступами классов.

Форма запускается из DLL. Но обратиться к ней для обновления данных уже не получается.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace gcw_dll
{
    public static class Class1
    {
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static int testik(int xx, int yy)
        {
            return xx + yy+1;
        }
 
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static void init()
        {
            Form1 MyFrm = new Form1();
            MyFrm.ShowDialog(); // открытие формы
        }
 
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static void newdata(double data1)
        {
            // пытаюсь изменить данные на форме
            Form1.label1.text = Convert.ToString(data1);
        }
    }
}
Была ошибка:
CS0122 'Form1.label1" недоступен из-за его уровня защиты.

Я зашел в Form1.Designer.cs и вместо:
C#
1
private System.Windows.Forms.Label label1;
сделал
C#
1
public System.Windows.Forms.Label label1;
теперь ошибка:
CS0120 Для не статического поля, метода или свойства "Form1.label1" требуется ссылка на объект.

Если добавить к public еще и static становится еще больше ошибок.

На stackoverflow пишут что нужно писать сеттер.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Button1_Click(object sender, EventArgs e)
        {
            label1.Text = "нажата";
        }
        public static void getLabel(string text)
        {
            label1.text = text;
            //Console.WriteLine("Hello World "+text);
        }
 
        private void Label1_Click(object sender, EventArgs e)
        {
            label1.Text = "нажата лейбл";
        }
        
    }
Написал getLabel. Но один фиг ошибка CS0120 Для не статического поля, метода или свойства "Form1.label1" требуется ссылка на объект.

Не пойму уже "куда копать"?

Добавлено через 1 час 2 минуты
создал наконец геттер. Оказывается почему-то нельзя писать static. Кто бы знал...

сначала написал так:
C#
1
2
3
4
public Label getLabel()
        {
           return label1;
        }
Но не понятно как ей потом пользоваться. В объект записываешь
C#
1
object lab = Form1.getLabel();
и тут же опять эта ошибка CS0120 Для не статического поля, метода или свойства "Form1.getLabel()" требуется ссылка на объект.

Пошел с другого пути.. пусть сама записывает на форму.
переписываю геттер на
C#
1
2
3
4
public void getLabel(string text)
        {
            label1.Text=text;
        }
ошибок нет.
Но вызов функции:
Form1.getLabel("тест");
сразу ошибка CS0120 Для не статического поля, метода или свойства "Form1.getLabel()" требуется ссылка на объект.

Уже бесит это хрень! Что за идиотизм то?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2019, 14:06
Ответы с готовыми решениями:

Обратиться к методу библиотеки DLL
Здравствуйте. Имеется библиотека DLL, построенная в MATLAB. Данная библиотека содержит один метод с двумя параметрами. Если добавить...

Обратиться к методу проекта через DLL
Здравствуйте! При написании кода возникла такая проблема: Описание: Есть исполняемый файл (.EXE) и библиотека пользовательских...

как обратиться к методам класса dll ?
сделал дллку. Ну это класс с методами. namespace Skeleton { public class Skeletons { public int fff() ... ...

11
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
28.07.2019, 14:38
Цитата Сообщение от AleksSerg Посмотреть сообщение
Я из другого языка и что-то не могу разобраться с доступами классов.

Форма запускается из DLL. Но обратиться к ней для обновления данных уже не получается.
А что в каком-то другом ОО языке по другому?

Есть типы и есть экземпляры этого типа.
Допустим, в коде
C#
18
19
20
21
22
        public static void init()
        {
            Form1 MyFrm = new Form1();
            MyFrm.ShowDialog(); // открытие формы
        }
Form1 - это тип, а MyFrm - это экземпляр этого типа. Элементы формы находятся не в типе формы, а в экземпляре формы.

Один из возможных вариантов решения:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace gcw_dll
{
    public static class Class1
    {
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static int testik(int xx, int yy)
        {
            return xx + yy+1;
        }
 
       Form1 MyFrm;
 
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static void init()
        {
            MyFrm = new Form1();
            MyFrm.ShowDialog(); // открытие формы
        }
 
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static void newdata(double data1)
        {
            // пытаюсь изменить данные на форме
            MyFrm.label1.text = Convert.ToString(data1);
        }
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
28.07.2019, 14:47
Но, лучше ваш вариант с дополнительной функцией в Form1. Только лучше сделать это как свойство
C#
1
public string LabelText { get =>  label1.Text; set =>  label1.Text=value; }
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace gcw_dll
{
    public static class Class1
    {
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static int testik(int xx, int yy)
        {
            return xx + yy+1;
        }
 
        Form1 MyFrm; /// Приватная переменная уровня класса
 
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static void init()
        {
            MyFrm = new Form1();
            MyFrm.ShowDialog(); // открытие формы
        }
 
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static void newdata(double data1)
        {
            // пытаюсь изменить данные на форме
            MyFrm.LabelText = Convert.ToString(data1);
        }
    }
}
0
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 32
28.07.2019, 15:03  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Один из возможных вариантов решения:
вынесли переменную в глобал класса. Интересно может ли это отразиться на работе DLL?
Но у меня на этот код та же ошибка: CS0120 Для не статического поля, метода или свойства "MyFrm.getLabel()" требуется ссылка на объект.

Может быть надо как-то форму по другому подключать?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но, лучше ваш вариант с дополнительной функцией в Form1. Только лучше сделать это как свойство
И на этот код так же ругается той же ошибкой. Требует ссылку на объект.

Ничего не понимаю...(
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
28.07.2019, 15:24
Цитата Сообщение от AleksSerg Посмотреть сообщение
Но у меня на этот код та же ошибка: CS0120 Для не статического поля, метода или свойства "MyFrm.getLabel()" требуется ссылка на объект.
Не обратил внимания, что класс Class1 у вас статический.
Надо
C#
17
        static Form1 MyFrm; /// Приватная переменная уровня класса
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
28.07.2019, 15:26
Цитата Сообщение от AleksSerg Посмотреть сообщение
вынесли переменную в глобал класса. Интересно может ли это отразиться на работе DLL?
Только тем, что эта переменная станет доступна всем методам класса.
0
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 32
28.07.2019, 15:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не обратил внимания, что класс Class1 у вас статический.
Надо
На это стал писать CS0122 'Form1.label1" недоступен из-за его уровня защиты.
Пробовал label1 сделать public в Designer но тогда другая ошибка.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
28.07.2019, 17:14
Цитата Сообщение от AleksSerg Посмотреть сообщение
На это стал писать CS0122 'Form1.label1" недоступен из-за его уровня защиты.
Пробовал label1 сделать public в Designer но тогда другая ошибка.
По умолчанию все элементы формы приватные. Файл дизайнера формы трогать нельзя - он создаётся конструктором форм VS. И любые изменения в нём чреваты непредсказуемыми багами.

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

Вам же от Form1 нужно только возможность вывести текст. Для класса Class1 "знание" о том как выводится этот текст излишне. Поэтому лучший вариант это объявить в Form1 публичное свойство для установки текста, как показано выше public string LabelText { get => label1.Text; set => label1.Text=value; }
.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
28.07.2019, 17:22
Цитата Сообщение от AleksSerg Посмотреть сообщение
Пробовал label1 сделать public в Designer но тогда другая ошибка.
В конструкторе формы в панели свойств можно установить нужное значение свойству Modifiers.
НО! Это плохое решение!
Используется только тогда когда нужен доступ целиком ко всему элементу.
Это бывает крайне редко. Допустим, когда создаётся какие-то "навороченные" UserControl.
0
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 32
28.07.2019, 18:43  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому лучший вариант это объявить в Form1 публичное свойство для установки текста, как показано выше
Я благодарен вам за помощь.

Еще я обнаружил ошибку в вашем примере. Вы предложили глобальную переменную для класса
C#
1
static Form1 MyFrm; /// Приватная переменная уровня класса
я исправил ее на
C#
1
static Form1 MyFrm = new Form1();
соответственно создание нового экземпляра класса в методе удалил.

Через геттеры все заработало. Напрямую не хочет. Ну да ладно.

Подскажите, может быть знаете. Возникла другая серьезная проблема.
MyFrm.ShowDialog(); похоже создает модальное окно. ДЛЛ зависает и не обрабатывает запросы, пока не MyFrm.hide()
Пробовал изначально делать MyFrm.Show(); форма появляется и зависает с колесиком загрузки навечно подвешивая платформу. Не понимаю почему так.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
28.07.2019, 19:30
Цитата Сообщение от AleksSerg Посмотреть сообщение
Еще я обнаружил ошибку в вашем примере. Вы предложили глобальную переменную для класса
Это не ошибка, а разные алгоритмы.
Я же не могу знать как вы используете класс и его методы.

Цитата Сообщение от AleksSerg Посмотреть сообщение
MyFrm.ShowDialog(); похоже создает модальное окно.
Да, это модальный показ окна.

Цитата Сообщение от AleksSerg Посмотреть сообщение
Пробовал изначально делать MyFrm.Show(); форма появляется и зависает с колесиком загрузки навечно подвешивая платформу. Не понимаю почему так.
Так не должно быть.
Надо смотреть проект целиком.
0
28.07.2019, 19:36
 Комментарий модератора 
Цитата Сообщение от AleksSerg Посмотреть сообщение
Подскажите, может быть знаете. Возникла другая серьезная проблема.
Создал новую тему с этим вопросом Форма появляется и зависает с колесиком загрузки навечно подвешивая платформу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.07.2019, 19:36
Помогаю со студенческими работами здесь

Как обратиться к форме через GET запрос?
нужно обратиться к форме на допустим сайте vk.com/login к форме login можно обратиться через ссылку заполняя таким образор...

Как обратиться к объекту на форме из другого класса
Здравствуйте! Очень интересует вопрос... У меня есть нестатическая форма (обычная созданная студией), на ней располагаются какие-то...

Как в цикле обратиться к конкретным кнопкам на форме и поменять им название?
На форме находится много всяких разных кнопочек. Мне же нужно в цикле for обратиться только к конкретным 10 кнопкам (у них поле Name:...

Использование собственной DLL
Имеется файл DLL: #include <Windows.h> int WINAPI DllMain(HINSTANCE hInstance, DWORD fdw, PVOID pv) { return TRUE; ...

Создание собственной DLL
Хочу сделать свою dll библеотеку , Только вот ничего не понимаю Можете научить? Очень прошу мне очень нужны знание о программировании...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru