亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c#調(diào)用c語言dll需要注意的地方

 更新時間:2021年03月22日 09:09:03   作者:weareu  
這篇文章主要介紹了c#調(diào)用c語言dll需要注意的地方,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

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

語言 C# C
類型 long long long/__int64
byte/Byte unsigned char
char

wchar_t

UInt32 size_t

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

// 此代碼為了方便頭文件在dll工程和調(diào)用該dll的工程中重復(fù)利用
// 為了方便其他使用者,建議dll開發(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();

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

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

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

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

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

PreserveSig,指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換;

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

Cdecl 調(diào)用方清理堆棧。這使您能夠調(diào)用具有 varargs 的函數(shù)(如 Printf),使之可用于接受可變數(shù)目的參數(shù)的方法。 
FastCall 不支持此調(diào)用約定。
StdCall 被調(diào)用方清理堆棧。這是使用平臺 invoke 調(diào)用非托管函數(shù)的默認(rèn)約定。 
ThisCall  第一個參數(shù)是 this 指針,它存儲在寄存器 ECX 中。其他參數(shù)被推送到堆棧上。此調(diào)用約定用于對從非托管 DLL 導(dǎo)出的類調(diào)用方法。 
Winapi  此成員實際上不是調(diào)用約定,而是使用了默認(rèn)平臺調(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的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論