轉貼 C 與C 的混合程式設計

2021-05-22 17:34:39 字數 3170 閱讀 7915

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 編譯後的函式名則總是將...