C# - как "подключить" код консольного приложения к графическому интерфейсу windows forms?
Я пытаюсь создать программу, в которой в форме Windows Forms пользователь, нажав на кнопку, может выбрать изображение из проводника файлов, которое отображается в графическом окне. С помощью кода консольного приложения путь к файлу изображения затем используется для поиска изображения, преобразования его в массив байтов, а затем отправки его вместе с необходимыми ключами API в API. Затем он возвращает ответ, который я хотел бы вывести в виде текстового поля.
Проблема в том, что я не могу заставить две части моего проекта "разговаривать "друг с другом - я не могу" вызывать " задачи в форме.cs из progam.cs, что может быть связано с тем, что они асинхронны? Я новичок в C#, и я не уверен, что объединение этих двух элементов в одну программу вообще возможно.
Вот мой код forms.cs:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace customvisionframework { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string Chosen_File = ""; openFD.InitialDirectory = "C:"; openFD.Title = "Submit an Image"; openFD.FileName = ""; openFD.Filter = "JPEG Images|*.jpg|GIF Images|*.gif"; if (openFD.ShowDialog() == DialogResult.Cancel) { MessageBox.Show("Operation Cancelled"); } else { Chosen_File = openFD.FileName; pictureBox1.Image = Image.FromFile(Chosen_File); string imageFilePath = Path.GetDirectoryName(Chosen_File); //ideally i would then call the method/task MakePredictionRequest(string imageFilePath) but it says 'makepredictionrequest' doesn't exist in this context } } } }
а вот и мой программный код.cs:
using System; using Newtonsoft.Json; using System.IO; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using System.Text; using System.Web; using System.Windows.Forms; using customvisionframework; namespace fakeBrokenBones { public static class Program { public static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } // MAKING THE PREDICTION REQUEST public static async Task MakePredictionRequest(string imageFilePath) { //create a new HTTP request var client = new HttpClient(); // adding valid Prediction-Key to Header. client.DefaultRequestHeaders.Add("Prediction-Key", "prediction key"); // this is the URL of the Prediction API that the HTTP request will be sent to. string url = "api url"; HttpResponseMessage response; // the byte array created from the image submitted is then added to the body of the HTTP request. byte[] byteData = GetImageAsByteArray(imageFilePath); using (var content = new ByteArrayContent(byteData)) { // sets the Content Type Header of the HTTP request to “application/octet-stream”. content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); // SENDING A REQUEST // sends HTTP request to the Prediction URL using the POST request method as an asynchronous operation. response = await client.PostAsync(url, content); // returns response from Prediction API, which has been serialised, as a string. //RETRIEVING A RESPONSE var responseString = await response.Content.ReadAsStringAsync(); // this response is then deserialised so that the desired data can be extracted. dynamic stuff = JsonConvert.DeserializeObject<object>(responseString); string broken = stuff.predictions[0].probability; string negative = stuff.predictions[1].probability; //ideally then I could use output the string negative and string broken in a rich textbox in my GUI> } } // CONVERTING FILE TO BYTE ARRAY private static byte[] GetImageAsByteArray(string imageFilePath) { // image from specified file path is open and read FileStream fileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read); // intialises BinaryReader class to convert image to binary BinaryReader binaryReader = new BinaryReader(fileStream); return binaryReader.ReadBytes((int)fileStream.Length); } } }
Что я уже пробовал:
Я искал везде, но не нашел ничего похожего на мою проблему. Я пробовал скопировать весь свой код program.cs в forms.cs, но ему это тоже не нравится.
На данный момент я просто хочу знать, возможно ли это на самом деле, потому что я потратил так много часов, пытаясь заставить его работать безрезультатно. Если есть способ сделать это, я был бы так благодарен и благодарен, если бы вы могли мне помочь.