如何在c++ /CLI中创建c#事件处理程序

本文关键字:创建 事件处理 程序 CLI c++ | 更新日期: 2023-09-27 18:13:56

下面是我的代码:

private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e)
{
    System::Speech::Recognition::SpeechRecognizer ^sr = gcnew System::Speech::Recognition::SpeechRecognizer();
    array<String ^> ^strs = gcnew array<String ^> {"Hello", "World"};
    System::Speech::Recognition::Choices ^colors = gcnew System::Speech::Recognition::Choices();
    colors->Add(strs);
    System::Speech::Recognition::GrammarBuilder ^gb = gcnew System::Speech::Recognition::GrammarBuilder();
    gb->Append(colors);
    System::Speech::Recognition::Grammar ^g = gcnew System::Speech::Recognition::Grammar(gb);
    sr->LoadGrammar(g);
    // System::IntPtr ptr = gcnew System::IntPtr(&sr_SpeechRecognized);
    sr->SpeechRecognized += gcnew System::EventHandler<System::Speech::Recognition::SpeechRecognizedEventArgs>(this,&Form1::sr_SpeechRecognized);
}
void sr_SpeechRecognized(System::Object ^sender, System::Speech::Recognition::SpeechRecognizedEventArgs^ e)
{
 }

此代码生成以下错误

1>------ Build started: Project: SpeechTest, Configuration: Debug Win32 ------
1>  SpeechTest.cpp
1>c:'users'yohan'documents'visual studio 2010'projects'speechtest'speechtest'Form1.h(144): error C3225: generic type argument for 'TEventArgs' cannot be 'System::Speech::Recognition::SpeechRecognizedEventArgs', it must be a value type or a handle to a reference type
1>c:'users'yohan'documents'visual studio 2010'projects'speechtest'speechtest'Form1.h(144): error C3352: 'void SpeechTest::Form1::sr_SpeechRecognized(System::Object ^,System::Speech::Recognition::SpeechRecognizedEventArgs ^)' : the specified function does not match the delegate type 'void (System::Object ^,System::Speech::Recognition::SpeechRecognizedEventArgs)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

在这里,除了处理程序创建sr->SpeechRecognized += gcnew System::EventHandler<System::Speech::Recognition::SpeechRecognizedEventArgs>(this,&Form1::sr_SpeechRecognized);

之外,一切都工作正常

如果注释掉这个处理程序部分,一切都会好起来的。这里的Form表示当前的GUI形式,即c++/CLI构建的默认GUI形式。所有这些代码都在表单中。我按照在一篇文章中读到的方式创建了这个处理程序。接下来我可以尝试什么?

如何在c++ /CLI中创建c#事件处理程序

你少了一个^

sr->SpeechRecognized += gcnew System::EventHandler<System::Speech::Recognition::SpeechRecognizedEventArgs^>(this,&Form1::sr_SpeechRecognized);
                                                                                           // right here ^

仔细查看收到的错误消息,删除名称空间,并使用换行符使其对齐。

<>之前错误C3352: 'void SpeechTest::Form1::sr_SpeechRecognized(Object^,SpeechRecognizedEventArgs^)':指定的函数不匹配委托类型'void (Object^,SpeechRecognizedEventArgs)'^之前

你正在尝试创建一个委托给一个接受SpeechRecognizedEventArgs的方法,但是你给了它一个接受SpeechRecognizedEventArgs^的方法的名称。