Назначьте консоль winform

Я выделяю и освобождаю консоль в приложении WinForm. В первый раз все работает нормально, но когда я запускаю FreeConsole() и снова запускаю AllocConsole, я получаю исключение Handle not Supported.

Код для выделения и бесплатная консоль ...

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern int AllocConsole();

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern int FreeConsole();

после этого я использую эти функции в своем коде, например:

private void BtnSave_Click(object sender, EventArgs e)
    {
        if (CB_Branches.SelectedItem == null)
        {
            PopUp.Show(new Response() { Type = "error", Message = "Please select a branch.", Title = "Branch Missing!" });
            return;
        }

        try
        {
            readexcel();
            Console.WriteLine("============ Operation Complete!!! ============");
            Console.WriteLine();
            Console.WriteLine("============ Press any key to continue ============");
            Console.ReadKey();
            FreeConsole();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

readExcel ()

public void readexcel() {
        bool err2 = false;
        try {
            FileInfo file = new FileInfo(txtPath.Text);
            Cursor.Current = Cursors.WaitCursor;
            using (ExcelPackage package = new ExcelPackage(file))
            {
                ExcelWorksheet workSheet = package.Workbook.Worksheets.First();
                int totalRows = workSheet.Dimension.Rows;
                progressBar1.Value = 0;
                Item itm = new Item();
                AllocConsole();
                Console.WriteLine("================= Adding Items (Inprogress...) ==================");
                for (int i = 2; i <= totalRows; i++)
                {
                    if (workSheet.Cells[i, 1].Value != null)
                    {
                        itm.Name = workSheet.Cells[i, 1].Value.ToString().ToUpper().Trim();

                        if (workSheet.Cells[i, 2].Value != null)
                        {
                            itm.Name = itm.Name + "_" + workSheet.Cells[i, 2].Value.ToString().ToUpper().Trim();
                        }
                    }
                    else
                    {
                        err2 = true;
                        Console.WriteLine( i + " =========># row Failed to save");
                        continue;
                    }

                    if (workSheet.Cells[i, 3].Value != null)
                    {
                        int ct = itmCatService.GetIdByName(workSheet.Cells[i, 3].Value.ToString());
                        if (ct == 0)
                        {
                            err2 = true;
                            Console.WriteLine(itm.Name + " =========> Failed to save");
                            continue;
                        }
                        else
                            itm.ItemCategoryId = ct;
                    }
                    else{
                        continue; 
                    }

                    if (workSheet.Cells[i, 4].Value != null)
                    {
                        itm.SalePrice = Convert.ToInt32(decimal.Parse(workSheet.Cells[i, 4].Value.ToString()));
                    }
                    else
                    {
                        err2 = true;
                        Console.WriteLine(itm.Name + " =========> Failed to save");
                        continue;
                    }

                    if (workSheet.Cells[i, 5].Value != null)
                    {
                        itm.TradePrice = Convert.ToInt32(decimal.Parse(workSheet.Cells[i, 5].Value.ToString()) );
                    }
                    else
                    {
                        err2 = true;
                        Console.WriteLine(itm.Name + " =========> Failed to save");
                        continue;
                    }

                    if (workSheet.Cells[i, 6].Value != null)
                    {
                        itm.ReorderLevel = int.Parse( workSheet.Cells[i, 6].Value.ToString() );
                    }
                    else
                    {
                        err2 = true;
                        Console.WriteLine(itm.Name + " =========> Failed to save");
                        continue;
                    }

                    if (workSheet.Cells[i, 7].Value != null)
                    {
                        itm.StockAmount = Convert.ToInt32(decimal.Parse(workSheet.Cells[i, 7].Value.ToString()));
                    }
                    else
                    {
                        err2 = true;
                        Console.WriteLine(itm.Name + " =========> Failed to save");
                        continue;
                    }

                    if (workSheet.Cells[i, 8].Value != null)
                    {
                        itm.Units = int.Parse(workSheet.Cells[i, 8].Value.ToString());
                    }
                    else
                    {
                        err2 = true;
                        Console.WriteLine(itm.Name + " =========> Failed to save");
                        continue;
                    }

                    if (workSheet.Cells[i, 9].Value != null)
                    {
                        int st = schoolService.GetIdByName(workSheet.Cells[i, 9].Value.ToString(), ((IdNameViewModel)CB_Branches.SelectedItem).Id);
                        if (st == 0)
                        {
                            err2 = true;
                            Console.WriteLine(itm.Name + " =========> Failed to save");
                            continue;
                        }
                        else
                            itm.SchoolId = st;
                    }
                    else
                    {
                        err2 = true;
                        Console.WriteLine(itm.Name + " =========> Failed to save");
                        continue;
                    }

                    itm.CreatedBy = UserDetails.UserId;
                    itm.Created = DateTime.Now;
                    itm.BranchId = ((IdNameViewModel)CB_Branches.SelectedItem).Id;

                    var res = itmService.CreateItem(itm);
                    if (res.Type.Equals("error") || res.Type.Equals("invalid"))
                    {
                        err2 = true;
                        Console.WriteLine(itm.Name+" =========> Failed to save");
                    }

                    progressBar1.Value = (i * 100) / totalRows; 
                }

                Cursor.Current = Cursors.Default;
                if (err2)
                {
                    MessageBox.Show("Some Items skipped or failed to save.!", "Operation Complete!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    MessageBox.Show("Items Created!", "Successful!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);

        }
    }

После отладки я узнал, что вызов Console.WriteLine(); после использования FreeConsole(); дает мне ошибку.

Пожалуйста, создайте минимальный воспроизводимый пример. Просто вызов AllocConsole(); FreeConsole(); AllocConsole(); работает.

CodeCaster 10.09.2018 09:15

@CodeCaster, добавлен подробный код.

Jamshaid Tariq 10.09.2018 10:03

Как идея, отдельная логика: вызовите AllocConsole () вне метода readexcel (). Кто может догадаться, что "readexcel" откроет консоль?

nabuchodonossor 10.09.2018 10:09

@nabuchodonossor, Предложение отмечено. но все же это не причина, по которой я получаю исключение.

Jamshaid Tariq 10.09.2018 10:16

кто-нибудь ответить?

Jamshaid Tariq 10.09.2018 11:49

вы нашли решение!

nabuchodonossor 10.09.2018 14:16
0
6
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, добавил еще немного кода, и теперь он работает нормально ....

1st добавил функцию и назвал ее вместо AllocConsole();.

    public static void CreateConsole()
    {
        AllocConsole();
        // reopen stdout
        TextWriter writer = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true };
        Console.SetOut(writer);
    }

затем перед Console.Read(); я добавил строку

Console.SetIn(new StreamReader(Console.OpenStandardInput()));

теперь он работает нормально.

Другие вопросы по теме