Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 
Многие привыкли считать, что для создания "оконного " приложения на C# им нужна полноценная Visual Studio, а для Visual Studio Code подходит лишь для создания консольного, давайте развеем эти мифы вместе! В этом примере мы создадим простое приложение для чтения дынных с датчика загрязнения воздуха (PM2.5).
Итак нам понадобится:
1. Установленная Visual Studio Code
2. Уcтановленные необходимые .NET SDK и Framework


Приступаем

1. Переходим в Visual Studio и устанавливаем расширения для поддержки C#C# Dev Kit, vscode-runner, .NET Meteor
2. Создаём и открываем папку и создаём новое windows forms приложение, написав в терминале: dotnet new winforms 
3. Открываем Form1.Designer.cs и добавляем в класс Form1

private System.Windows.Forms.WebBrowser webBrowser1;

4. В методе InitializeComponent:

private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.webBrowser1 = new System.Windows.Forms.WebBrowser();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450); // первичный размер основной формы
this.Text = "Form1";
this.webBrowser1.Name = "webBrowser1"; //инициализируем обьект браузера
this.webBrowser1.ScrollBarsEnabled = false;
this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.WebBrowser1DocumentCompleted);
this.webBrowser1.AllowWebBrowserDrop = false;
this.webBrowser1.IsWebBrowserContextMenuEnabled = false;
this.webBrowser1.WebBrowserShortcutsEnabled = false;
this.webBrowser1.ObjectForScripting = this;
string curDir = Directory.GetCurrentDirectory();
this.webBrowser1.Url = new System.Uri(String.Format("file:///{0}/interface/title.html", curDir)); //адрес странички нашего интерфейса
this.ResizeEnd += new EventHandler(Form1_ResizeEnd); //при изменении размера изменяем и размер контрола "браузера"
this.Controls.Add(this.webBrowser1);
this.ResumeLayout(false);
this.PerformLayout();

}

5. Добавляем методы - обработчики событий (Events):
 

 

private void WebBrowser1DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
           this.webBrowser1.Size = new Size(this.Size.Width, this.Size.Height);
        }
private void Form1_ResizeEnd(object sender, System.EventArgs e)
        {
           this.webBrowser1.Size = new Size(this.Size.Width, this.Size.Height);
        }

Полный код модуля:

namespace AIR_MASTER_CONTROL;

partial class Form1
{
    private System.ComponentModel.IContainer components = null;
    private System.Windows.Forms.WebBrowser webBrowser1;

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    private void WebBrowser1DocumentCompleted(object sender,
           WebBrowserDocumentCompletedEventArgs e)
    {
        this.webBrowser1.Size = new Size(this.Size.Width, this.Size.Height);
    }
    private void Form1_ResizeEnd(object sender, System.EventArgs e)
    {
        Control control = (Control)sender;
        this.webBrowser1.Size = new Size(this.Size.Width, this.Size.Height);
    }
    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.webBrowser1 = new System.Windows.Forms.WebBrowser();
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(800, 450);
        this.Text = "Form1";
        this.webBrowser1.Name = "webBrowser1";
        this.webBrowser1.ScrollBarsEnabled = false;
        this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.WebBrowser1DocumentCompleted);
        this.webBrowser1.AllowWebBrowserDrop = false;
        this.webBrowser1.IsWebBrowserContextMenuEnabled = false;
        this.webBrowser1.WebBrowserShortcutsEnabled = false;
        this.webBrowser1.ObjectForScripting = this;
        this.ResizeEnd += new EventHandler(Form1_ResizeEnd);
        string curDir = Directory.GetCurrentDirectory();
        this.webBrowser1.Url = new System.Uri(String.Format("file:///{0}/interface/index.html", curDir));
        this.Controls.Add(this.webBrowser1);
        this.ResumeLayout(false);
        this.PerformLayout();
    }
}

6. В папке со скомпилированным бинарником создаём папку interface, а внутри неё файл index.html
7. Мы можем вызывать функции JavaScript (находящиеся в файле /interface/index.html) из нашей C# программы, например, следующим образом:
        SetValuesToHTML(webBrowser1.Document, ref ValuesOfSource); // передаём ссылку на массив чисел типа float 
         public Int16 SetValuesToHTML(System.Windows.Forms.HtmlDocument document, ref float[] ValuesOfSource)
        {
            Object[] objArray = new Object[3];
            for (int i = 0; i < 3; i++)
                objArray[i] = (Object)(ValuesOfSource[i]);
            document.InvokeScript("SetValuesToHTML", objArray); // функция, принимающая массив чисел типа (в JavaScript)
            return 0;
        }
На стороне JavaScript принимающий метод:

function SetValuesToHTML(current, voltage, temperature){
        document.all['Current'].value = current;
	document.all['Voltage'].value = voltage;
	document.all['Temperature'].value = temperature;
	}

8. Мы можем вызывать функции(методы)  С# из JavaScript  следующим образом:

window.external.SendSettingsCOM(document.all['number'].value);
На стороне C# вызываемый метод - внутри класса Form1:
public void SendSettingsCOM (int ExtraParam){ // transfer settings to COM-port
            
 byte[] data = { 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00};
 
 if (ExtraParam < 0)
     data[1] = 0x00;
 else 
     if(ExtraParam != 0 )
     data[1] = 0x01;
 
  data[2] = (byte)((ExtraParam < 0) ? -ExtraParam : ExtraParam);
  
  if(MyPort != null)
      MyPort.Write(data, 0, data.Length);
  }