c#是執行在clr之上被託管的,而c++則並沒有被託管。
目前.net平台中託管環境呼叫非託管環境有三種方法:
①p/invoke
②c++ interop
③com interop
這三種方法當中,c++ interop是針對託管c++使用的方法(微軟自己弄的一套c++,語法和傳統c++很不一樣),com interop則是針對window軟體開發而採用的方式。所以我們只剩下一種解決方案:也就是pinvoke來進行託管環境與非託管環境的互操作。
在c++中這樣寫:
_declspec(dllexport) int add (int a, int b)
_declspec(dllexport) int subtract (int a, int b)
__declspec(dllexport)代表需要匯出的函式,需要放在函式定義的前面。
在c#中這些寫:
using system.runtime.interopservices;
[dllimport("use_c++.dll",entrypoint = "?add@@yahhh@z")]
public static extern int add(int x, int y);
c++編譯器為了支援過載,所以在編譯的時候給每乙個介面都重新定義了唯一的名字,這個過程被稱為「名字粉碎」。這個名字就是dll找到介面的入口位址。
?我們使用vs自帶的工具dumpbin。
在vs的安裝檔案中搜尋」dumpbin.exe」,並為之設定為系統環境變數,這樣我們就可以在任何檔案下使用dumpbin命令了。
如果是呼叫win32:
//移動視窗
[dllimport("user32.dll", entrypoint = "movewindow")]
public static extern bool movewindow(system.intptr hwnd, int x, int y, int nwidth, int nheight, bool brepaint);
//開啟窗體方法,filename是的窗體名稱,包含路徑
private void openandsetwindow(string filename)
另外,movewindow只能設定視窗的大小和位置;setwindowpos擁有movewindow的全部功能之外,還可以設定視窗的層疊關係(如,把指定的視窗放在所有視窗的最上層–always on top就可以用這個函式、或者把指定的視窗放在另乙個視窗的下層,等等)。 沒有什麼優缺點可言,只是功能上的大小有別。完全可以不用movewindow,而只用setwindowpos;但是,在只要設定視窗大小或位置的情況下,也完全可以使用movewindow.
關於dllimport引數的含義:
C 中呼叫C 的DLL
c 經過這麼多年的發展已經積累了大量的動態連線庫,如果能夠在.net環境裡應用這些函式庫,可以很大的提高整個應用的開發速度。使用c 程式設計的人員肯定對指標不會感到陌生,由於c 中的函式介面好多都可能定義成位指標,而c 中只有在宣告為unsafe code中才能夠使用指標。如果想讓c 的dll支援在...
C 中呼叫 除錯C 的DLL
被c 呼叫的dll一般只需要把匯出的函式 以適當的形式呈現即可呼叫,比如 extern c declspec dllexport bool integrate3 這樣的函式,在c 裡面宣告如 dllimport dll callingconvention callingconvention.stdc...
C 中呼叫C 編寫的Dll
在vs2013中建立乙個win32控制台專案,單擊下一步,然後選擇dll。生成的工程目錄結構為 在自動生成的檔案中,dllmain.cpp 作為定義dll應用程式的入口點,它的作用跟exe檔案有個main或者winmain入口函式是一樣的。可以在目標cpp檔案 dllcxj.cpp 中編寫自己要實現...