C#調(diào)用C++使用C++/CLI的實(shí)現(xiàn)
簡(jiǎn)介
C++/CLI(C++ Common Language Infrastructure)是一種允許在 .NET 平臺(tái)上創(chuàng)建托管代碼(managed code)和非托管代碼(unmanaged code)之間互操作的語(yǔ)言。其原理可以概括如下:
編譯器支持: C++/CLI 編譯器能夠編譯同時(shí)包含托管和非托管代碼的源文件。這使得在同一個(gè)項(xiàng)目中可以混合使用 C++ 和 C# 或其他 .NET 語(yǔ)言。
托管和非托管代碼的橋梁: C++/CLI 提供了語(yǔ)法和關(guān)鍵字,允許你在同一個(gè)文件中編寫(xiě)托管代碼和非托管代碼。這些代碼可以相互調(diào)用,使得 C# 和 C++ 之間的交互變得簡(jiǎn)單。
CLR(Common Language Runtime)集成: C++/CLI 代碼在編譯時(shí)會(huì)生成對(duì) CLR 的調(diào)用,因此它可以利用 CLR 提供的各種功能,例如垃圾回收、類(lèi)型安全性和異常處理等。
托管代碼的封裝: 在 C++/CLI 中,你可以將非托管的 C++ 代碼封裝在托管的類(lèi)中,通過(guò)公共接口暴露給其他 .NET 語(yǔ)言。這樣,C++ 的功能可以被其他 .NET 語(yǔ)言輕松調(diào)用和使用。
數(shù)據(jù)類(lèi)型轉(zhuǎn)換: C++/CLI 提供了一組轉(zhuǎn)換操作符和工具,用于在托管代碼和非托管代碼之間進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。這樣,你可以在 C++/CLI 中輕松處理 C# 中的數(shù)據(jù)類(lèi)型,反之亦然。
資源管理: 在 C++/CLI 中,你可以使用托管的資源管理功能(如
gcnew
創(chuàng)建托管對(duì)象和delete
銷(xiāo)毀對(duì)象),同時(shí)也可以手動(dòng)管理非托管資源(如使用析構(gòu)函數(shù)釋放內(nèi)存)。
新建解決方案->CSharpCPlusSolution
新建動(dòng)態(tài)鏈接庫(kù)(DLL)->CPlusNative
新建類(lèi)NativeCalculate
//NativeCalculate.h #pragma once #ifndef NATIVE_CLASS_H #define NATIVE_CLASS_H class __declspec(dllexport) NativeCalculate { public: static int Add(int a, int b); }; #endif // NATIVE_CLASS_H
//NativeCalculate.cpp #include "pch.h" #include "NativeCalculate.h" int NativeCalculate::Add(int a, int b) { return a + b; }
Build CPlusNative項(xiàng)目確保能成功生成CPlusNative.dll和CPlusNative.lib文件
新建CLI類(lèi)庫(kù)(DLL)->CPlusWrapper
添加包含目錄 NativeCalculate.h
添加 CPlusNative.lib附加庫(kù)目錄
添加附加庫(kù)依賴(lài)項(xiàng) CPlusNative.lib
創(chuàng)建包裝類(lèi)NativeCPlusWrapper
上述配置完畢后,CPlusWrapper項(xiàng)目創(chuàng)建包裝類(lèi)NativeCPlusWrapper
//NativeCPlusWrapper.h #pragma once using namespace System; namespace CPlusWrapper { public ref class NativeCPlusWrapper { public: static int Add(int a, int b); }; }
//CPlusWrapper.cpp #include "pch.h" #include "NativeCPlusWrapper.h" #include "NativeCalculate.h" using namespace CPlusWrapper; int NativeCPlusWrapper::Add(int a, int b) { int sum = 0; sum = NativeCalculate::Add(a, b); return sum; }
Build CPlusWrapper項(xiàng)目確保能成功生成CPlusWrapper.dll文件
新建C# 控制臺(tái)項(xiàng)目 CSharpConsoleApp
添加CPlusWrapper.dll引用
CSharpConsoleApp項(xiàng)目調(diào)用NativeCPlusWrapper方法
namespace CSharpConsoleApp { class Program { static void Main(string[] args) { int sum = CPlusWrapper.NativeCPlusWrapper.Add(33, 66); } } }
常見(jiàn)錯(cuò)誤
程序運(yùn)行目錄找不到CPlusNative.dll所以報(bào)錯(cuò)
拷貝CPlusNative.dll 到 Debug目錄下即可
或者使用Pre-build event command line
"$(ProjectDir)..\Debug\CPlusNative.dll" "$(TargetDir)"
到此這篇關(guān)于C#調(diào)用C++使用C++/CLI的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C#調(diào)用C++ 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#編程實(shí)現(xiàn)動(dòng)態(tài)改變配置文件信息的方法
這篇文章主要介紹了C#編程實(shí)現(xiàn)動(dòng)態(tài)改變配置文件信息的方法,涉及C#針對(duì)xml格式文件的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06C#實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C#面向?qū)ο缶幊讨幸蕾?lài)反轉(zhuǎn)原則的示例詳解
在面向?qū)ο缶幊讨校琒OLID?是五個(gè)設(shè)計(jì)原則的首字母縮寫(xiě),旨在使軟件設(shè)計(jì)更易于理解、靈活和可維護(hù)。本文將通過(guò)實(shí)例詳細(xì)講講C#面向?qū)ο缶幊讨幸蕾?lài)反轉(zhuǎn)原則,需要的可以參考一下2022-07-07C#實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)庫(kù)數(shù)據(jù)到Excel文件
利用C#編程語(yǔ)言的強(qiáng)大特性和豐富的.NET庫(kù)支持,開(kāi)發(fā)人員可以高效地完成從數(shù)據(jù)庫(kù)到Excel文件的數(shù)據(jù)遷移,下面就跟隨小編一起學(xué)習(xí)一下具體操作吧2024-12-12c# asp .net 動(dòng)態(tài)創(chuàng)建sql數(shù)據(jù)庫(kù)表的方法
c# asp .net 動(dòng)態(tài)創(chuàng)建sql數(shù)據(jù)庫(kù)表的方法,需要的朋友可以參考一下2013-04-04C# 通過(guò)反射獲取類(lèi)型的字段值及給字段賦值的操作
這篇文章主要介紹了C# 通過(guò)反射獲取類(lèi)型的字段值及給字段賦值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Unity?UGUI的EventSystem事件系統(tǒng)組件介紹使用
這篇文章主要為大家介紹了Unity?UGUI的EventSystem事件系統(tǒng)組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07