我從兩個方面進行回答,一個是本地調用,一個是遠程調用。
本地調用又兩個方面闡述,
1、
進程間通信(IPC,InterProcessCommunication)是指在不同進程之間傳播或交換信息。IPC的方式通常有
JavaJDK提供了
通過C++調用Python腳本,主要利用Python提供的API,實際上,
- 初始化Python解釋器,若初始化失敗,繼續調用會出現各種錯誤
voidPy_Initialize(void)
檢查Python解釋器是否初始化,返回0表示沒有經過初始化
intPy_IsInitialized(void)
反初始化解釋器,包括子解釋器,同時釋放Python解釋器占用的資源
voidPy_Finalize()
實際上是一個宏,執行Python代碼
intPyRun_SimpleString(constchar*command)
導入一個模塊,name是Python文件的文件名,不帶.py,類似于Python內建的import
PyObject*PyImport_ImportModule(char*name)
相當于Python模塊對象的dict屬性,得到模塊名稱空間下的字典對象
PyObject*PyModule_GetDict(PyObject*module)
執行一段Python代碼
PyObject*PyRun_String(constchar*str,intstart,PyObject*globals,PyObject*locals)
把Python數據類型轉換為C的類型
intPyArg_Parse(PyObject*args,char*format,...)
返回模塊對象o的attr_name屬性或函數,相當于Python中的表達式o.attr_name
PyObject*PyObject_GetAttrString(PyObject*o,char*attr_name)
構建一個參數列表,將C類型轉換為Python對象
PyObject*Py_BuildValue(char*format,...)
調用Python函數,兩個參數都是Python對象指針,pfunc是要調用的Python函數,一般來說,可以用過PyObject_GetAttrString()獲得,pargs是函數的參數列表,通常是Py_BuildValue()來構建的
PyObject*PyEval_CallObject(PyObject*pfunc,PyObject*pargs)
提供了三種調用方式
extern“C”__declspec(dllexport)int__stdcallAdd(intn1,intn2);
__stdcall表示調用約定:參數都是從右向左通過堆棧傳遞,函數調用在返回前要由被調用者清理堆棧。
在C#中,調用如下:
[DllImport(“SampleCppWrapper.dll”)]privatestaticexternintAdd(intn1,intn2);
注意參數的類型,之后,可直接在C#編程中使用這個方法。
C#不能直接調用C++類庫中的類,需要一種變通的解決方式,通過再做一個C++類庫把要調用的類成員方法暴露出來
C++的回調函數是一種事件響應機制,和C#的委托相似,比如一個C++類中的回調函數:個人感覺與方法二大同小異,沒有深入去探究,所以也就不太清楚功能上的優劣
RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
其中客戶機,服務器都可能是不同的語言,也有可能相同。他們通過RPC實現了互通