個人記錄在c 中呼叫c 的dll

2021-09-27 00:12:10 字數 1504 閱讀 8996

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 中編寫自己要實現...