我們有一個項目,其中包含許多C ++(使用ATL),VB6和最近的C#遺留代碼。我們最近將組件從C ++移植到了C#,該事件觸發由C ++,VB6和C#中的組件處理的事件。從理論上講,一切正常,但是觸發事件會生成許多System.NotImplementedExceptions。我已經修改了觸發事件的代碼,以便它分別調用每個事件處理程序,這樣一個對象的異常不會阻止它在下一個對象中調用事件處理程序。if ( GeneratedChannelChange != null ){ // Invoke each handler separately, so that an exception in one invokation does not prevent us calling the next one. foreach ( GeneratedChannelChangeEventHandler del in GeneratedChannelChange.GetInvocationList() ) { try { del.Invoke ( GenChan, ChangeMask ) ; } catch ( Exception ) {} }}實際上,由ATL向導生成的原始C ++代碼也忽略了invoke函數返回的錯誤。這似乎工作正常,但是我對它產生的大量異常不滿意。在調試器中運行時,這也會降低性能。我認為只有在C ++類中處理事件時才會引發異常。這是使用ATL類IDispEventSimpleImpl實現的。我發現的是,IDispEventSimpleImpl沒有實現功能GetIDsOfNames??隙〞{用此函數,并且它將返回E_NOTIMPL??赡苁切碌腃#代碼正在調用函數GetIDsOfNames,而舊的C ++代碼沒有嗎?如果是這樣,是否有任何簡單的方法可以在使用IDispEventSimpleImpl的類中實現功能GetIDsOfNames?如果我的分析是錯誤的,是否有“正確”的方法在C#(作為事件源)和C ++(作為事件接收器)中實現事件邏輯?
將COM事件從C#觸發到C ++的正確方法是什么
慕工程0101907
2021-05-11 17:49:45