類本質上是壹種數據結構和封裝的操作。數據結構在頭文件中定義,編譯時可以訪問;成員函數是從dll導出的。當導出C++類庫時,這些函數名將根據編譯器的標準進行擴展,例如
B類{
int運算符(int a,int b);
};
裏面的操作符成員函數實際上會被編譯成類似如下的函數:
int _ _ this call B _ operator XXXXXX(B * _ this,int a,int B);
(關鍵字_ __thiscall實際上在C++中找不到)
我註意到名字後面添加了類似亂碼的東西,這是C++編譯器根據後面的參數列表自動生成的後綴。由於這個後綴,具有相同名稱和不同參數的函數以及成員函數可以在代碼中共存(所謂的重載)。
也就是說,如果妳想調用C++類庫中的壹個函數,妳至少應該知道編譯器把這個函數編譯成了什麽名字,但實際上,不同編譯器編譯的結果是不同的。
其實這不是問題。如果在編譯時設置了輸出細節,有壹種方法可以找出實際名稱被編譯成什麽。更嚴重的問題來自調用約定:
如上所述,C++的成員函數采用__thiscall的調用約定。所謂的調用約定是指在調用函數時如何傳遞參數、以什麽順序傳遞參數以及由誰負責清理堆棧的約定。托管程序的【DllImport】屬性不支持_ __thiscall的調用約定。
當然也不排除可以調用壹些間接方法。即便如此,還是強烈推薦。