C++項(xiàng)目中調(diào)用C#DLL的三種方式
方法一:使用COM技術(shù)
1.在C#中創(chuàng)建COM可見的類庫(kù)
在C#項(xiàng)目中,確保類庫(kù)項(xiàng)目屬性中的“Make assembly COM-Visible”選項(xiàng)被勾選。這會(huì)為類庫(kù)生成一個(gè)GUID,并將其注冊(cè)為COM組件。
例如,創(chuàng)建一個(gè)C#類庫(kù)項(xiàng)目MyCSharpLibrary,并添加一個(gè)類MyClass:
下面展示一些 內(nèi)聯(lián)代碼片
。
using System; using System.Runtime.InteropServices; [ComVisible(true)] [Guid("YOUR-GUID-HERE")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IMyClass { void MyMethod(); } [ComVisible(true)] [Guid("YOUR-CLASS-GUID-HERE")] public class MyClass : IMyClass { public void MyMethod() { Console.WriteLine("Hello from C#!"); } }
生成DLL后,使用regasm工具將其注冊(cè)為COM組件:
下面展示一些 內(nèi)聯(lián)代碼片
。
regasm MyCSharpLibrary.dll /codebase
2.在C++中調(diào)用COM組件
在C++代碼中,通過COM接口調(diào)用C#類庫(kù)中的方法:
下面展示一些 內(nèi)聯(lián)代碼片
。
#include <iostream> #import "MyCSharpLibrary.tlb" // 導(dǎo)入類型庫(kù)文件 int main() { CoInitialize(NULL); // 初始化COM庫(kù) IMyClassPtr myClass(__uuidof(MyClass)); // 創(chuàng)建COM對(duì)象 myClass->MyMethod(); // 調(diào)用方法 CoUninitialize(); // 釋放COM庫(kù) return 0; }
注意:需要確保C++項(xiàng)目中鏈接了ole32.lib和oleaut32.lib。
方法二:使用C++/CLI
C++/CLI是一種混合編程語言,允許在C++代碼中直接使用托管代碼(如C#代碼)。
創(chuàng)建C++/CLI項(xiàng)目
在Visual Studio中創(chuàng)建一個(gè)C++/CLI項(xiàng)目,例如MyCppCliWrapper。
在C++/CLI中引用C# DLL
在C++/CLI項(xiàng)目中添加對(duì)C# DLL的引用。
創(chuàng)建一個(gè)托管類來封裝C#類的功能:
下面展示一些 內(nèi)聯(lián)代碼片
。
// MyCppCliWrapper.h #pragma once using namespace System; public ref class MyCppCliWrapper { public: void CallCSharpMethod(); }; // MyCppCliWrapper.cpp #include "MyCppCliWrapper.h" #include "MyCSharpLibrary.h" // 引用C#類庫(kù) void MyCppCliWrapper::CallCSharpMethod() { MyCSharpLibrary::MyClass^ myClass = gcnew MyCSharpLibrary::MyClass(); myClass->MyMethod(); }
3.在C++代碼中調(diào)用C++/CLI封裝
在C++代碼中調(diào)用C++/CLI封裝的函數(shù):
下面展示一些 內(nèi)聯(lián)代碼片
。
#include <iostream> #include "MyCppCliWrapper.h" int main() { MyCppCliWrapper^ wrapper = gcnew MyCppCliWrapper(); wrapper->CallCSharpMethod(); return 0; }
方法三:使用P/Invoke(適用于C#導(dǎo)出非托管接口)
如果C# DLL中導(dǎo)出了非托管接口(例如通過DllImport或[UnmanagedCallersOnly]),可以直接在C++中通過函數(shù)指針調(diào)用。
在C#中導(dǎo)出非托管接口
使用[UnmanagedCallersOnly]屬性導(dǎo)出方法:
下面展示一些 內(nèi)聯(lián)代碼片
。
using System; using System.Runtime.InteropServices; public class MyClass { [UnmanagedCallersOnly(EntryPoint = "MyMethod")] public static void MyMethod() { Console.WriteLine("Hello from C#!"); } }
在C++中調(diào)用導(dǎo)出的函數(shù)
加載DLL并獲取函數(shù)指針:
下面展示一些 內(nèi)聯(lián)代碼片
。
#include <iostream> #include <windows.h> typedef void (*MyMethodFunc)(); int main() { HMODULE hModule = LoadLibrary("MyCSharpLibrary.dll"); if (hModule) { MyMethodFunc myMethod = (MyMethodFunc)GetProcAddress(hModule, "MyMethod"); if (myMethod) { myMethod(); } FreeLibrary(hModule); } return 0; }
總結(jié)
COM技術(shù):適合需要跨語言調(diào)用的場(chǎng)景,但需要額外的注冊(cè)和配置。
C++/CLI:適合需要在C++中直接調(diào)用托管代碼的場(chǎng)景,代碼更簡(jiǎn)潔。
P/Invoke:適合C#導(dǎo)出非托管接口的場(chǎng)景,調(diào)用方式更接近原生C++。
到此這篇關(guān)于C++項(xiàng)目中調(diào)用C#DLL的三種方式的文章就介紹到這了,更多相關(guān)C++調(diào)用C# DLL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C# 調(diào)用C++寫的dll的實(shí)現(xiàn)方法
- C++調(diào)用C#的DLL實(shí)現(xiàn)方法
- C#調(diào)用C++dll方法步驟
- C++與C#互調(diào)dll的實(shí)現(xiàn)步驟
- C#調(diào)用C++DLL傳遞結(jié)構(gòu)體數(shù)組的終極解決方案
- C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法
- c#調(diào)用c++的DLL的實(shí)現(xiàn)方法
- 基于C#調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針的問題詳解
- C#程序調(diào)用C++動(dòng)態(tài)庫(kù)(dll文件)遇到的坑及解決
- C#程序如何調(diào)用C++?dll詳細(xì)教程
相關(guān)文章
C++通過循環(huán)實(shí)現(xiàn)猜數(shù)字小游戲
這篇文章主要為大家詳細(xì)介紹了C++通過循環(huán)實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫(kù)操作指南
Qt SQL模塊為數(shù)據(jù)庫(kù)提供了編程支持,Qt支持很多種常見的數(shù)據(jù)庫(kù),如 MySQL Oracle、MS SQL Server、SQLite等,下面這篇文章主要介紹了這篇文章主要給大家介紹了關(guān)于Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫(kù)操作指南的相關(guān)資料,需要的朋友可以參考下2022-08-08C語言數(shù)據(jù)結(jié)構(gòu)順序表中的增刪改(頭插頭刪)教程示例詳解
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)順序表中增刪改關(guān)于頭插頭刪的教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02基于C語言實(shí)現(xiàn)點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能
這篇文章主要介紹了C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能,Ping命令被送到本地計(jì)算機(jī)的IP軟件,該命令永不退出該計(jì)算機(jī),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-08-08