C#調用C++ dll編寫的程序


title: 'C#調用C++ dll編寫的程序'
date: 2016-04-10 18:37:16
tags: C#
categories: c#


編寫c dll

  1. 創(chuàng)建一個win32程序如孝,選擇DLL
  2. 新建一個.h 文件比如 CDLL.h
  3. 創(chuàng)建一個.cpp文件 CDLL.cpp
extern  "C" _declspec(dllexport) int Add(int x, int y)
{
    return x + y;
}
extern  "C" _declspec(dllexport) int Sub(int x, int y)
{
    return x - y;
}

  1. 在.h 文件對函數(shù)進行申明
  2. 在.cpp文件里對文件定義

extern "C" 包含雙重含義欺矫,從字面上即可得到:首先分预,被它修飾的目標>是“extern”的;其次诈皿,被它修飾的目標是“C”的。而被extern "C"修飾 >的變量和函數(shù)是按照C語言方式編譯和連接的管宵。
__declspec(dllexport)的目的是為了將對應的函數(shù)放入到DLL動態(tài)庫中前痘。 extern "C" __declspec(dllexport)加起來的目的是為了使用DllImport調用非托管C++的DLL文件。因為使用DllImport只能調用由C語言函數(shù)做成的DLL坎拐。

c#調用dll

  1. 將該dll放到c#文件目錄下
  2. 開始編寫代碼
[DllImport("Win32Project1.dll", EntryPoint = "Add", CharSet = CharSet.Auto,CallingConvention = CallingConvention.Cdecl)]
        extern static int Add(int x, int y);

[DllImport("Win32Project1.dll", EntryPoint = "Sub", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        extern static int Sub(int x, int y);
        static void Main(string[] args)
        {
            Console.WriteLine(Add(10, 2).ToString());
            Console.WriteLine(Sub(10, 2).ToString());
            Console.Read();
        }

dllimport 調用該dll, EntryPoint 調用函數(shù)的名字烦磁,CharSet 字符編碼,
CharSet屬性是用來確定在托管與非托管調用的過程中用什么字符編碼來封送數(shù)據(jù),因為我們的.NET平臺是采用的Unicode編碼哼勇,而標準C++是采用的Ansi編碼都伪,在我們了解了非托管代碼的編碼方式之后,我們就很確定用什么編碼积担,那么如果我們不清楚非托管代碼是用什么語言編寫的或者不清楚它的編碼方式時陨晶,我們可以使用CharSet枚舉中的auto值,讓CLR自動為我們處理相關細節(jié)帝璧;
DllImport特性中的CallingConvention可選屬性先誉;
CallingConvention屬性也是一個比較重要的屬性,在平臺調用的過程中起到查找入口點的作用的烁,在托管代碼進行非托管代碼入口點查找時褐耳,會通過CallingConvention中的值進行確認非托管入口點的調用約定,上篇文章中我們提到了調用約定的一些概念撮躁,

tips

我在寫好代碼后報錯漱病,在百度一番后知道是x86的dll在64位的程序里調用會出問題,所以我調整了Any cpu 為x86.然后可以正常運行了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末把曼,一起剝皮案震驚了整個濱河市杨帽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗤军,老刑警劉巖注盈,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叙赚,居然都是意外死亡老客,警方通過查閱死者的電腦和手機僚饭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胧砰,“玉大人鳍鸵,你說我怎么就攤上這事∥炯洌” “怎么了偿乖?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哲嘲。 經(jīng)常有香客問我贪薪,道長,這世上最難降的妖魔是什么眠副? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任画切,我火速辦了婚禮,結果婚禮上囱怕,老公的妹妹穿的比我還像新娘霍弹。我一直安慰自己,他們只是感情好娃弓,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布庞萍。 她就那樣靜靜地躺著,像睡著了一般忘闻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恋博,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天齐佳,我揣著相機與錄音,去河邊找鬼债沮。 笑死炼吴,一個胖子當著我的面吹牛,可吹牛的內容都是我干的疫衩。 我是一名探鬼主播硅蹦,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闷煤!你這毒婦竟也來了童芹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鲤拿,失蹤者是張志新(化名)和其女友劉穎假褪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體近顷,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡生音,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年宁否,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀遍。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡慕匠,死狀恐怖,靈堂內的尸體忽然破棺而出域醇,到底是詐尸還是另有隱情台谊,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布歹苦,位于F島的核電站青伤,受9級特大地震影響,放射性物質發(fā)生泄漏殴瘦。R本人自食惡果不足惜狠角,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚪腋。 院中可真熱鬧丰歌,春花似錦、人聲如沸屉凯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悠砚。三九已至晓勇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灌旧,已是汗流浹背绑咱。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枢泰,地道東北人描融。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像衡蚂,于是被迫代替她去往敵國和親窿克。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容