Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 12.08.2019
Сообщений: 3
1

Как работать с глобальными переменными\классами

12.08.2019, 15:22. Показов 581. Ответов 4

Добрый день,

Задача - нужно создать свой SSH клиент для терминального подключения к сетевому оборудованию

Условия - в качестве наиболее простого выхода было принято использовать готовую библиотеку из NuGet - Renci SSH. Программа должна использовать ТОЛЬКО одно сетевое подключение по SSH к устройству - не допускается создавать множественные терминальные подключения к одному или нескольким устройствам. Для реализации программы используется Windowsform

Проблема - не могу создать публичный объект терминального подключения чтобы к нему обращаться из любой процедуры внутри программы.

Вопрос:
В каком месте программы или как правильно создать (например объявив его самостоятельным классом) объект SSH Client служащий для подключения через терминал.

Листинг программы (без ошибок но при старте выдает Exception - ругается что логин задан не правильно)

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Renci.SshNet;
using Renci.SshNet.Common;
 
 
namespace WindowsFormsApp1
{
    class SSHClientObj {
        public static string NameServer_str = "";
        public static int    PortNumber_int = 0;
        public static string Login_str = "";
        public static string Password_str = "";
 
        public static Renci.SshNet.SshClient LocalClient = new SshClient(NameServer_str,
                                                         PortNumber_int,
                                                         Login_str,
                                                         Password_str);
 
 
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           // SSHClientobj sshClient01 = new SSHClientobj();
        }
 
      
 
 
        public void ConnectButton_Click(object sender, EventArgs e)
        {
 
            try
            {
               SSHClientobj.NameServer_str = this.Servername_textBox.Text;
               SSHClientobj.Login_str = this.Login_textBox.Text;
               SSHClientobj.Password_str = this.Password_textBox.Text;
               SSHClientobj.PortNumber_int = Convert.ToInt16(this.PortNumber_textBox.Text);
 
 
                SSHClientobj.LocalClient.Connect();
                if (SSHClientobj.LocalClient.IsConnected) richTextBox1.Text += "Connected  "+DateTime.Now+ "\r\n";
                else richTextBox1.Text += "Can't connected  " + DateTime.Now + "\r\n";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 
            
        }
 
        public void DisconnectButton_Click(object sender, EventArgs e)
        {
            SSHClientobj.LocalClient.Disconnect();
            richTextBox1.Text += "\r\n  Disconnected  " + DateTime.Now+"\r\n";
        }
 
        private void ExecCommandButton_Click(object sender, EventArgs e)
        {
            richTextBox1.Text += ("-------- "+ExecCommand_textBox.Text+" --------- \r\n");
 
            try { richTextBox1.Text += SSHClientobj.LocalClient.RunCommand(this.ExecCommand_textBox.Text).Result; } // выполняем команду на удаленном сервере
            catch (Exception ex)    { MessageBox.Show(ex.Message); }
 
            this.richTextBox1.SelectionStart = richTextBox1.TextLength;
            this.richTextBox1.ScrollToCaret();
            
 
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.DisconnectButton_Click(sender, new EventArgs());
        }
 
        private void TabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
 
        }
 
        private void ExecCommand_textBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                ExecCommandButton_Click(sender, new EventArgs());
                ExecCommand_textBox.Text = "";
                ExecCommand_textBox.Focus();
            }
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2019, 15:22
Ответы с готовыми решениями:

Работа с глобальными переменными
Всем привет. Подскажите, пожалуйста, допустим у меня есть много классов в программе, в каких то...

Как работать с переменными, объявленными в другом классе?
Добрый день! Помогите, пожалуйста, объявила через конструктор переменные. затем запускается...

Массив: Как сделать массив и рандом глобальными?
Мне пришлось в каждом таймере создать массив, рандом и "отжать" все перечисленные в массиве клавиши...

Как работать с глобальными переменными в AVR?
Добрый день. Вот код: #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>...

4
907 / 792 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
12.08.2019, 15:26 2
Если вы уберёте со своего класса из полей слово static то и ошибка исчезнет, зачем он там неясно раз вы решили создавать экземпляр данного класса?
0
0 / 0 / 0
Регистрация: 12.08.2019
Сообщений: 3
12.08.2019, 15:33  [ТС] 3
Насколько я понял модификатор Static - говорит компилятору зарезервировать под данную переменную место в оперативной памяти, если не писать Статик - то инициализация функции

C#
1
2
3
4
Renci.SshNet.SshClient LocalClient = new SshClient(NameServer_str,
                                                         PortNumber_int,
                                                         Login_str,
                                                         Password_str);
Выдает ошибку

Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка CS0236 Инициализатор поля не может обращаться к нестатическому полю, методу или свойству "SSHClientobj.NameServer_str". WindowsFormsApp1 D:\!Programm C#\ControlCisco01\WindowsFormsApp1\Form1.cs 22 Активный
0
214 / 148 / 48
Регистрация: 28.12.2016
Сообщений: 716
12.08.2019, 16:43 4
Аркадий Матвеев, почитайте mdsn, я хз как можно ssh писать, не понимаю что значит статика...

В пример есть класс
C#
1
2
3
internal class Class1{
        public int Num;
    }

2 экземпляра класса, со своими значениями. Экземпляр создается через new
C#
1
2
3
4
5
var a = new Class1():
var b = new Class1();
 
a.Num = 5;
b.Num = 7;
А это статический класс, нельзя создавать экземпляры.
C#
1
2
3
internal static class Class1{
        public static int Num;
    }
Напрямую обращаемся
C#
1
Class1.Num = 5;

Если вам хочется как в поговорке рыбку съесть и на *****. То можете посмотреть в сторону синглтона, это по сути статический класс, только с плюшками от обычного (наследовать, интерфейсы, переопределять методы и т.д)

Добавлено через 6 минут
Так попробуйте

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class SSHClientObj {
        public static string NameServer_str = "";
        public static int    PortNumber_int = 0;
        public static string Login_str = "";
        public static string Password_str = "";
 
        public static Renci.SshNet.SshClient LocalClient;
 
 static SSHClientObj (){
LocalClient = new SshClient(NameServer_str,
                                                         PortNumber_int,
                                                         Login_str,
                                                         Password_str);
}
    }
0
0 / 0 / 0
Регистрация: 12.08.2019
Сообщений: 3
12.08.2019, 17:03  [ТС] 5
Спасибо за совет - попробовал, ничего не получилось.

Вы порекомендовали создать явный конструктор класса, в этому случае в программе ниже он должен вызываться - например в событии Click_Buttn01 - в этом случае созданный экземпляр класса не доступен из иных процедур данного приложения (например при событии Click_Buttn02).

Сейчас приложение вылетает с ошибкой на уровне Try Catch (при нажатии на кнопку)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2019, 17:03

Подскажите как работать с глобальными переменными
Подскажите как работать с глобальными переменными, прочел что их нет в java. Мне нужно объявить...

Как работать с глобальными переменными в методах?
Есть такой не хитрый код: #глобальная переменная используемая в качестве счетчика counter=0 ...

FormCreate отказывается работать с глобальными переменными типа string
Вот процедура FormCreate. p и a - глобальные переменные типа integer. procedure...

Как добавить свой класс с глобальными переменными в приложении Windows Forms Application C#
Добрый день, помогите пожалуйста пытаюсь добавить класс с глобальными переменными в свой проект...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru