2 回答

TA貢獻1836條經(jīng)驗 獲得超4個贊
反過來比較容易,因為C#的P/Invoke就是做這個的。但是顯然C++沒有關(guān)于C#代碼回調(diào)的的實現(xiàn),因為C++的架構(gòu)從來也沒考慮過還會調(diào)用C#(這種情況實在是太少見了,況且也不必要)。如果非要實現(xiàn)可以采用多進程,使用進程間通信。我想到的:
1.模仿linux中的管道(PIPE),產(chǎn)生虛擬文件,而C++阻塞直到文件產(chǎn)生或本身超時。這樣可以實現(xiàn)數(shù)據(jù)交換,既能實現(xiàn)傳數(shù)據(jù)又可以使C++程序及時得到通知。缺點就是IO密集,降低效率。
2.使用TCP通信,監(jiān)聽端口獲取消息,這是跨平臺程序通信最常用也是最正統(tǒng)的方法。一般是跨操作系統(tǒng)編程常用的,比如windows和linux ubuntu server程序進行交互。你所述情況雖然不算跨操作系統(tǒng)通信,但是也是跨平臺了。而且想想就知道C++作為先出現(xiàn)的語言而且是編譯型語言,調(diào)用C#托管區(qū)的函數(shù)還要設(shè)回調(diào),其難度可想而知。
3.如果你的C++是基于winform的,可以在C#中P/Invoke調(diào)用winAPI的SendMessage發(fā)送窗體消息從而間接實現(xiàn)回調(diào)。
4.自然還有一些更底層的Dirty方法,比如嵌匯編更改上下文程序指針地址。。。不過不適合正統(tǒng)的程序,因為太Dirty啊。。。而且出錯概率大。
除此之外,如果不采用多線程通信,C#的反射(reflection)特性可以參考,但是控制權(quán)依然在C#。況且C#無從知道C++的內(nèi)部結(jié)構(gòu),自然難以直接調(diào)用。你想想吧,是不是這個道理~
- 2 回答
- 0 關(guān)注
- 1692 瀏覽
添加回答
舉報