c#調(diào)用c語(yǔ)言dll需要注意的地方
一、將C#工程和C的dll工程放在同一個(gè)解決方案下,這樣就可以實(shí)現(xiàn)聯(lián)動(dòng)調(diào)試,直接從C#中進(jìn)入C的dll函數(shù)里。注意:每次更改dll中的代碼后都必須重新生成dll。另,C#與C中有幾種變量類(lèi)型不對(duì)應(yīng),注意聲明時(shí)的區(qū)分。
語(yǔ)言 | C# | C |
類(lèi)型 | long | long long/__int64 |
byte/Byte | unsigned char | |
char |
wchar_t |
|
UInt32 | size_t |
二、dll工程中頭文件加入以下代碼:
// 此代碼為了方便頭文件在dll工程和調(diào)用該dll的工程中重復(fù)利用 // 為了方便其他使用者,建議dll開(kāi)發(fā)者定義TESTDLL宏 #ifdef TESTDLL #define DLLAPI _declspec(dllexport) #else #define DLLAPI _declspec(dllimport) #endif // 此代碼為了保證使用C編譯器編譯代碼,防止函數(shù)名出現(xiàn)其他后綴 #ifdef __cpluscplus extern "C" { #endif // 插入所需導(dǎo)出的代碼,例如: int DLLAPI testdll(); #ifdef __cpluscplus } #endif
三、dll工程中源文件加入以下代碼(注意:該代碼應(yīng)該出現(xiàn)于上述頭文件之前):
#define TESTDLL
四、C#工程中,需要調(diào)用dll函數(shù)的文件中加入以下代碼:
// 導(dǎo)入testdll函數(shù) [DllImport(@"../../../Debug/testdll.dll", EntryPoint = "testdll", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] extern static int testdll();
第一個(gè)參數(shù)是dll文件所在地址,由于該dll與C#工程在同一個(gè)解決方案中因此可以寫(xiě)成上述形式;
EntryPoint, 函數(shù)的名稱,可以不寫(xiě),下面一行有聲明;
SetLastError, 指示方法是否保留 Win32"上一錯(cuò)誤";
CharSet, dll中字符串的表達(dá)方式,通常使用Ansi或者Unicode;該設(shè)置會(huì)將C#中的字符自動(dòng)轉(zhuǎn)換為設(shè)置的方式,例如上述設(shè)置會(huì)將工程中的字符串轉(zhuǎn)換為Ansi字符;
ExactSpelling,指示 EntryPoint 是否必須與指示的入口點(diǎn)的拼寫(xiě)完全匹配;
PreserveSig,指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換;
CallingConvention,調(diào)用慣例,通常C語(yǔ)言使用Cdecl方式CallingConvention,如果該值與dll中的調(diào)用方式不一致,通常會(huì)造成堆棧不平衡,導(dǎo)致PInvoke報(bào)錯(cuò),該選項(xiàng)有如下幾個(gè)值:
Cdecl | 調(diào)用方清理堆棧。這使您能夠調(diào)用具有 varargs 的函數(shù)(如 Printf),使之可用于接受可變數(shù)目的參數(shù)的方法。 |
FastCall | 不支持此調(diào)用約定。 |
StdCall | 被調(diào)用方清理堆棧。這是使用平臺(tái) invoke 調(diào)用非托管函數(shù)的默認(rèn)約定。 |
ThisCall | 第一個(gè)參數(shù)是 this 指針,它存儲(chǔ)在寄存器 ECX 中。其他參數(shù)被推送到堆棧上。此調(diào)用約定用于對(duì)從非托管 DLL 導(dǎo)出的類(lèi)調(diào)用方法。 |
Winapi | 此成員實(shí)際上不是調(diào)用約定,而是使用了默認(rèn)平臺(tái)調(diào)用約定。例如,在 Windows 上默認(rèn)為 StdCall,在 Windows CE.NET 上默認(rèn)為 Cdecl。 |
以上就是c#調(diào)用c dll需要注意的地方的詳細(xì)內(nèi)容,更多關(guān)于c#調(diào)用c dll的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c#求點(diǎn)到直線的投影點(diǎn)坐標(biāo)
這篇文章主要介紹了c#求直線外一點(diǎn)到該直線的投影點(diǎn),大家參考使用吧2013-12-12DevExpress設(shè)置FocusedNode背景色的方法
這篇文章主要介紹了DevExpress設(shè)置FocusedNode背景色的方法,很實(shí)用的功能,需要的朋友可以參考下2014-08-08C#使用Json.Net對(duì)JSON與對(duì)象的序列化與反序列化
這篇文章介紹了Json.Net對(duì)JSON與對(duì)象的序列化與反序列化,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C# Winform實(shí)現(xiàn)導(dǎo)出DataGridView當(dāng)前頁(yè)以及全部數(shù)據(jù)
基本上,所有的業(yè)務(wù)系統(tǒng)都會(huì)要求有導(dǎo)出的功能,所以這篇文章主要為大家介紹了如何利用Winform實(shí)現(xiàn)原生DataGridView的導(dǎo)出功能,需要的可以參考一下2023-07-07關(guān)于c#中枚舉類(lèi)型支持顯示中文的擴(kuò)展說(shuō)明
需求?。骸∶杜e類(lèi)型在界面顯示的時(shí)候可以顯示相應(yīng)的中文信息, 這樣界面對(duì)用戶友好 . 場(chǎng)景 : 在一些業(yè)務(wù)中涉及到審核功能的時(shí)候, 往往有這幾個(gè)狀態(tài) :未送審 , 審核中 ,審核通過(guò), 駁回?。∵@個(gè)時(shí)候我們會(huì)定義一個(gè)枚舉類(lèi)型來(lái)描述 :2013-03-03Unity UGUI的HorizontalLayoutGroup水平布局組件介紹使用
這篇文章主要為大家介紹了Unity UGUI的HorizontalLayoutGroup水平布局組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07C#簡(jiǎn)單讀取、改變文件的創(chuàng)建、修改及訪問(wèn)時(shí)間的方法
這篇文章主要介紹了C#簡(jiǎn)單讀取、改變文件的創(chuàng)建、修改及訪問(wèn)時(shí)間的方法,涉及C#文件類(lèi)SetCreationTime、SetLastWriteTime及SetLastAccessTime的相關(guān)使用技巧,需要的朋友可以參考下2015-07-07