2013-11-14 26 views
-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

回答

1

您的問題是完全與Windows窗體。使用System.Windows.Forms.Textbox對象(tbMidiInMessage)的Invoke方法或擁有它的System.Windows.Forms.Form(您的C#UI代碼中的this對象)。

+0

我完全facepalmed我讀了你的答案後,由於一些邏輯錯誤或某事我相信,異常是由讀取訪問MidiMessage成員造成的......謝謝 – Xaser