c#寫介面比較方便,而c++則擅長寫演算法,所以將兩者結合起來將會加快程式的開發速度,並保證程式的質量。但c#與c++的混合程式設計有很多細節問題需要注意,下面簡要列舉一些並指出相應的解決辦法。
1. 將本機c++**(指非託管c++)編譯成乙個dll,供c#呼叫,呼叫方法為 [dllimport(×××.dll)] 。但是這裡只能從 dll 匯出函式,不能匯出類(還沒有測試能否匯出變數)。不能匯出類是因為本機c++是非託管的,與c#的語言方式不相容。也就是說,不能將此類dll作為引用 新增到c#工程中,ide會提示不是乙個程式集。
2. 利用clr c++(指託管c++)編寫輸出類庫,供c#使用,由於clr c++和c#都符合cls規範,所以兩者可以無縫整合,在乙個解決方案裡包含這兩種語言的專案。生成的dll可以匯出類。但是clr c++與傳統c++有很大的區別,可以認為是另一種不同的語言,學習它也要話費很大的精力,所以這種方法也有些麻煩。clr c++不相容本機c++的很多內容,但可以利用指標來操作。
native c++==>>c# gui
如果按照上面的方法做會出現一些問題。比如本機c++檔案dllclass.h:
// 此類是從dllclass.dll 匯出的
class
dllclass_api
cdllclass ;
託管c++檔案algoclr.h:
namespace
algoclr ; }
c#檔案program.cs:
class1
cls = new
class1();
cls.function();
全部編譯成功後開始除錯,偵錯程式會停在 class1
cls = new
class1() 處,提示出現filenotfoundexception異常:
去掉 class1
cls = new
class1() 這一行則不會出現問題。這是因為程式需要本機c++的dll,而它沒有找到。在targetdir(即××/bin/debug目錄)裡沒有本機c++的 dll,但是有clr c++的dll,所以我們只需要將本機c++的dll複製到該目錄中即可。在c#專案的「屬性」->「生成事件」的「生成後事件命令列」中輸入
copy $(solutiondir)debug/dllclass.dll $(targetdir)
dllclass.dll為本機c++**生成的dll。然後編譯執行,就可以看到正確的結果。附生成事件語法:
命令列編輯框
包含要為預先生成或後期生成執行的事件。
注意在執行 .bat 檔案的所有後期生成命令之前新增乙個 call 語句。例如,call c:/myfile.bat 或 call c:/myfile.bat call c:/myfile2.bat。
巨集 展開編輯框,顯示要插入命令列編輯框中的巨集列表。
巨集表
列出可用的巨集及其值。有關每個巨集的說明,請參見下面的「巨集」。一次只能選擇將乙個巨集插入命令列編輯框中。
插入
將在巨集表中選擇的巨集插入命令列編輯框中。
可以使用以下任意巨集來指定檔案位置,或在存在多重選擇的情況下獲取輸入檔案的實際名稱。這些巨集不區分大小寫。巨集說明
$(configurationname)
當前專案配置的名稱(例如,「debug|any cpu」)。
$(outdir)
輸出檔案目錄的路徑,相對於專案目錄。這解析為「輸出目錄」屬性的值。它包括尾部的反斜槓「/」。
$(devenvdir)
visual studio 2005 的安裝目錄(定義為驅動器 + 路徑);包括尾部的反斜槓「/」。
$(platformname)
當前目標平台的名稱。例如「anycpu」。
$(projectdir)
專案的目錄(定義為驅動器 + 路徑);包括尾部的反斜槓「/」。
$(projectpath)
專案的絕對路徑名(定義為驅動器 + 路徑 + 基本名稱 + 副檔名)。
$(projectname)
專案的基本名稱。
$(projectfilename)
專案的檔名(定義為基本名稱 + 副檔名)。
$(projectext)
專案的副檔名。它在副檔名的前面包括「.」。
$(solutiondir)
解決方案的目錄(定義為驅動器 + 路徑);包括尾部的反斜槓「/」。
$(solutionpath)
解決方案的絕對路徑名(定義為驅動器 + 路徑 + 基本名稱 + 副檔名)。
$(solutionname)
解決方案的基本名稱。
$(solutionfilename)
解決方案的檔名(定義為基本名稱 + 副檔名)。
$(solutionext)
解決方案的副檔名。它在副檔名的前面包括「.」。
$(targetdir)
生成的主輸出檔案的目錄(定義為驅動器 + 路徑)。它包括尾部的反斜槓「/」。
$(targetpath)
生成的主輸出檔案的絕對路徑名(定義為驅動器 + 路徑 + 基本名稱 + 副檔名)。
$(targetname)
生成的主輸出檔案的基本名稱。
$(targetfilename)
生成的主輸出檔案的檔名(定義為基本名稱 + 副檔名)。
$(targetext)
生成的主輸出檔案的副檔名。它在副檔名的前面包括「.」。
【來自:http://hi.baidu.com/wpzhao/blog/item/df3bb645fd2e972ecefca3eb.html】
c與c 混合程式設計
在純c的系統中使用c 的類出現了編譯錯誤!程式 begin mymain.c include thesocket.h void main int argc,char argv end mymain.c begin thesocket.h class thesocket end thesocket.h...
c與c 混合程式設計
1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似 c語言的全域性 變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是...
C與C 混合程式設計
c 是在 c 語言的基礎上發展起來的。在某種程度上,我們可將 c 看做 c 的一種擴充套件。在本質上,二者的資料型別和函式呼叫慣例都是一致的,因此 c 與 c 混合編譯也是很自然的事情。二者的區別僅在於編譯後函式的名字不同 c 簡單地使用函式名而不考慮引數的個數或型別,而 c 編譯後的函式名則總是將...