-1
我已經在C++/CLI中編寫了一個庫,可以更容易地從託管代碼訪問MIDI功能。該庫有一個託管類,其中包含一個提供委託作爲事件處理程序的類,並且它由midiInOpen函數的「本機」回調方法調用。C++/CLI庫中的回調委託在C#代碼中導致InvalidOperationException - 如何調用?
void MidiInDevice::MidiInProcNative(HMIDIIN midiInDevice, UINT msg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
if(MidiInProcedure == nullptr)
return;
MidiMessage^ message;
switch(msg)
{
case MIM_DATA:
{
message = gcnew MidiMessage(dwParam1, dwParam2);
break;
}
}
MidiInProcedure(this, message);
}
現在我已經加入這個方法給委託,這是加載C++/CLI庫中的C#應用程序的一部分:
public void MidiInProc(SharpMidi.MidiInDevice midiInDevice, SharpMidi.MidiMessage message)
{
tbMidiInMessages.AppendText(String.Format("\n{0}: {1:X}", message.TimestampString, message.Message));
}
不過,我得到一個InvalidOperationException(跨線程操作無效)撥打AppendText
。
當用谷歌搜索這個問題時,我充斥着異常的明顯的Windows窗體案例,這在某種程度上並不能真正幫助我,因爲我的MidiMessage類不提供任何調用功能。
那麼我有什麼選擇來解決這個問題?
問候, Xaser
我完全facepalmed我讀了你的答案後,由於一些邏輯錯誤或某事我相信,異常是由讀取訪問MidiMessage成員造成的......謝謝 – Xaser