中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c#調用c語言dll需要注意的事項有哪些

發布時間:2021-03-22 10:45:08 來源:億速云 閱讀:214 作者:小新 欄目:開發技術

小編給大家分享一下c#調用c語言dll需要注意的事項有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、將C#工程和C的dll工程放在同一個解決方案下,這樣就可以實現聯動調試,直接從C#中進入C的dll函數里。注意:每次更改dll中的代碼后都必須重新生成dll。另,C#與C中有幾種變量類型不對應,注意聲明時的區分。

語言C#C
類型longlong long/__int64
byte/Byteunsigned char
char

wchar_t

UInt32size_t

二、dll工程中頭文件加入以下代碼:

// 此代碼為了方便頭文件在dll工程和調用該dll的工程中重復利用
// 為了方便其他使用者,建議dll開發者定義TESTDLL宏
#ifdef  TESTDLL
#define DLLAPI _declspec(dllexport)
#else
#define DLLAPI _declspec(dllimport)
#endif
 
// 此代碼為了保證使用C編譯器編譯代碼,防止函數名出現其他后綴
 
#ifdef __cpluscplus
extern "C" {
#endif
 
// 插入所需導出的代碼,例如:
int DLLAPI testdll();
 
#ifdef __cpluscplus
}
#endif

三、dll工程中源文件加入以下代碼(注意:該代碼應該出現于上述頭文件之前):

#define TESTDLL

四、C#工程中,需要調用dll函數的文件中加入以下代碼:

// 導入testdll函數
[DllImport(@"../../../Debug/testdll.dll", EntryPoint = "testdll", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
 
extern static int testdll();

第一個參數是dll文件所在地址,由于該dll與C#工程在同一個解決方案中因此可以寫成上述形式;

EntryPoint, 函數的名稱,可以不寫,下面一行有聲明;

SetLastError, 指示方法是否保留 Win32"上一錯誤";

CharSet, dll中字符串的表達方式,通常使用Ansi或者Unicode;該設置會將C#中的字符自動轉換為設置的方式,例如上述設置會將工程中的字符串轉換為Ansi字符;

ExactSpelling,指示 EntryPoint 是否必須與指示的入口點的拼寫完全匹配;

PreserveSig,指示方法的簽名應當被保留還是被轉換;

CallingConvention,調用慣例,通常C語言使用Cdecl方式CallingConvention,如果該值與dll中的調用方式不一致,通常會造成堆棧不平衡,導致PInvoke報錯,該選項有如下幾個值:

Cdecl調用方清理堆棧。這使您能夠調用具有 varargs 的函數(如 Printf),使之可用于接受可變數目的參數的方法。 
FastCall不支持此調用約定。
StdCall被調用方清理堆棧。這是使用平臺 invoke 調用非托管函數的默認約定。 
ThisCall 第一個參數是 this 指針,它存儲在寄存器 ECX 中。其他參數被推送到堆棧上。此調用約定用于對從非托管 DLL 導出的類調用方法。 
Winapi 此成員實際上不是調用約定,而是使用了默認平臺調用約定。例如,在 Windows 上默認為 StdCall,在 Windows CE.NET 上默認為 Cdecl。 

以上是“c#調用c語言dll需要注意的事項有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

颍上县| 平原县| 平远县| 富民县| 清河县| 疏附县| 九龙坡区| 时尚| 齐河县| 盐城市| 和硕县| 怀宁县| 麻江县| 沽源县| 洪湖市| 塘沽区| 阳新县| 广州市| 墨江| 陈巴尔虎旗| 石首市| 西畴县| 河北区| 隆尧县| 嘉祥县| 台江县| 仲巴县| 西平县| 古田县| 广丰县| 溆浦县| 吉林市| 云浮市| 通化县| 吉木乃县| 福贡县| 临汾市| 会理县| 东宁县| 区。| 通州市|