WedX - журнал о программировании и компьютерных науках

Ошибка в управлении полем со списком WinForm DotNet 4.8 — VS2019

Я пишу приложение winforms на С# (НЕ ASP.NET!) И получаю сообщение об ошибке в элементе управления полем со списком (заполнено или нет, выбрано или нет), которое выглядит так:

Управляемый помощник по отладке 'NonComVisibleBaseClass'
Message=Управляемый помощник по отладке 'NonComVisibleBaseClass' : 'Был выполнен вызов QueryInterface с запросом интерфейса класса видимого управляемого класса COM 'ComboBoxUiaProvider'. Однако, поскольку этот класс является производным от не видимого COM класса ComboBoxExAccessibleObject, вызов QueryInterface завершится ошибкой. Это делается для того, чтобы базовый класс, невидимый для COM, не ограничивался правилами управления версиями COM».

Я не вижу ничего плохого (это очень простое приложение для тестирования) с кодом

    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 System.Speech;
using System.Speech.Synthesis;

namespace SpeechDemoApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private SpeechSynthesizer _SS = new SpeechSynthesizer();

        private void button1_Click(object sender, EventArgs e)
        {
            _SS.Speak(txtSpeech.Text.Trim());
        }


        private void button2_Click(object sender, EventArgs e)
        {
            var ivs = _SS.GetInstalledVoices();
            foreach (var iv in ivs)
            {
                ComboboxItem cboItem = new ComboboxItem();
                cboItem.Text = iv.VoiceInfo.Name;
                cboItem.Value = iv.VoiceInfo.Name;
                cboVoices.Items.Add(cboItem);
            }


        }

    }

    public class ComboboxItem
    {
        public string Text { get; set; }
        public object Value { get; set; }

        public override string ToString()
        {
            return Text;
        }
    }
}

Поле со списком заполняется правильно, однако при нажатии на поле со списком возникает ошибка, указанная выше. Я не могу понять, что происходит. Обратите внимание, что это приложение WinForms (извините, я должен постоянно упоминать об этом, поскольку никто не читает сообщения, прежде чем отвечать), а НЕ приложение WPF или ASP.NET.

15.03.2020

  • Управляемый код синтезатора речи или неуправляемый код (из С++)? Исключение COM обычно заключается в том, что вы пытаетесь вызвать неуправляемый код из управляемого С#. Возможно, вам придется вызывать методы с помощью DLLImport. 16.03.2020
  • попробуйте загрузить поле со списком .text и .value с фиктивным текстом или int, а не из информационного объекта iv voice, и посмотрите, исчезнет ли ваша ошибка. как поле со списком .value и .Text работают на основе некоторых предположений о .ToString и о том, как .Value может опрашивать объект. В действительности VoiceInfo не является идеальным объектом, и вам нужен сетевой посредник. 16.03.2020
  • Смотрите мой ответ ниже (он не имеет ничего общего с речевой библиотекой - я воспроизвел эту ошибку 4.8 в новом проекте) 16.03.2020
  • Код, размещенный здесь, никогда не будет воспроизводить проблему. Ваш ComboBoxItem бесполезен, как показано здесь, так что, вполне вероятно, это не то, что вы там делаете, и это не настоящий объект, который вы храните. Кстати, это исключение является необязательным, его можно отключить. -- (.Net Framework 4.8 не основан на DotNetCore и, конечно, работает в Windows 7.) 16.03.2020
  • От Microsoft: JIT в .NET 4.8 основан на .NET Core 2.1, поэтому все исправления ошибок и многие оптимизации производительности на основе генерации кода из .NET Core 2.1 теперь доступны в .NET Framework. 16.03.2020
  • Поле со списком работает просто отлично, на самом деле. Он загружается нормально, и его выбор не приводит к сбою, если он не скомпилирован с 4.8FW. 16.03.2020

Ответы:


1

Перекомпилирован в DotNetFramework 4.5, 4.6*, 4,7* и протестирован для каждой подверсии, и все они работают отлично.
Это ошибка DotNetFramework 4.8, о которой, по-видимому, не сообщалось/не устранено в Microsoft. Понижение до 4.7.2 устранило проблему

Чтобы продублировать эту проблему - вот полный и работающий код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SpeechDemoApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private SpeechSynthesizer _SS = new SpeechSynthesizer();

        private void btnSpeak_Click(object sender, EventArgs e)
        {
            if (cboVoices.SelectedIndex >= 0)
            {
                _SS.SelectVoice(cboVoices.SelectedItem.ToString());
            }
            _SS.Volume = trackBar1.Value;
            _SS.SpeakAsync(txtPhrase.Text.Trim());
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            var ivs = _SS.GetInstalledVoices();
            foreach (var iv in ivs)
            {
                ComboboxItem cboItem = new ComboboxItem();
                cboItem.Text = iv.VoiceInfo.Name;
                cboItem.Value = iv.VoiceInfo.Name;
                cboVoices.Items.Add(cboItem);
            }

            if (cboVoices.Items.Count > 0)
            {
                cboVoices.SelectedIndex = 0;
            }
        }

        private void cboVoices_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {

        }

        protected override void OnClosing(CancelEventArgs e)
        {
            _SS.SpeakAsyncCancelAll();
            base.OnClosing(e);
        }
    }



    public class ComboboxItem
    {
        public string Text { get; set; }
        public object Value { get; set; }

        public override string ToString()
        {
            return Text;
        }
    }
}

И дизайнер:

namespace SpeechDemoApp
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.cboVoices = new System.Windows.Forms.ComboBox();
            this.txtPhrase = new System.Windows.Forms.TextBox();
            this.btnSpeak = new System.Windows.Forms.Button();
            this.trackBar1 = new System.Windows.Forms.TrackBar();
            ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
            this.SuspendLayout();
            // 
            // cboVoices
            // 
            this.cboVoices.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.cboVoices.FormattingEnabled = true;
            this.cboVoices.Location = new System.Drawing.Point(41, 37);
            this.cboVoices.Name = "cboVoices";
            this.cboVoices.Size = new System.Drawing.Size(144, 21);
            this.cboVoices.TabIndex = 0;
            this.cboVoices.SelectedIndexChanged += new System.EventHandler(this.cboVoices_SelectedIndexChanged);
            // 
            // txtPhrase
            // 
            this.txtPhrase.Location = new System.Drawing.Point(41, 82);
            this.txtPhrase.Name = "txtPhrase";
            this.txtPhrase.Size = new System.Drawing.Size(664, 20);
            this.txtPhrase.TabIndex = 1;
            this.txtPhrase.Text = "This is a test of the Emergency Webcast System. If this were an actual emergency," +
    " you would be bleeding from all of your orifices.";
            // 
            // btnSpeak
            // 
            this.btnSpeak.Location = new System.Drawing.Point(41, 127);
            this.btnSpeak.Name = "btnSpeak";
            this.btnSpeak.Size = new System.Drawing.Size(92, 23);
            this.btnSpeak.TabIndex = 2;
            this.btnSpeak.Text = "Speak";
            this.btnSpeak.UseVisualStyleBackColor = true;
            this.btnSpeak.Click += new System.EventHandler(this.btnSpeak_Click);
            // 
            // trackBar1
            // 
            this.trackBar1.Location = new System.Drawing.Point(240, 127);
            this.trackBar1.Maximum = 100;
            this.trackBar1.Name = "trackBar1";
            this.trackBar1.Size = new System.Drawing.Size(465, 45);
            this.trackBar1.TabIndex = 3;
            this.trackBar1.Value = 80;
            this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll);
            // 
            // Form2
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Controls.Add(this.trackBar1);
            this.Controls.Add(this.btnSpeak);
            this.Controls.Add(this.txtPhrase);
            this.Controls.Add(this.cboVoices);
            this.Name = "Form2";
            this.Text = "Form2";
            this.Load += new System.EventHandler(this.Form2_Load);
            ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.ComboBox cboVoices;
        private System.Windows.Forms.TextBox txtPhrase;
        private System.Windows.Forms.Button btnSpeak;
        private System.Windows.Forms.TrackBar trackBar1;
    }
}
15.03.2020
  • Я должен указать, что на машине разработчика установлена ​​​​Windows 8.1 (я полагаю, поскольку DotNetFramework 4.8 основан на DotNetCore, он не поддерживает Windows до версии 10 — это гипотеза) 16.03.2020
  • Обнаружена эта ошибка при попытке перенести старое приложение winforms .Net Framework 4 в современную эпоху. 4.7.2 будет достаточно для моих целей. Спасибо, что изучили это. 08.02.2021
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]