C++項(xiàng)目中調(diào)用C#DLL的三種方式
方法一:使用COM技術(shù)
1.在C#中創(chuàng)建COM可見的類庫
在C#項(xiàng)目中,確保類庫項(xiàng)目屬性中的“Make assembly COM-Visible”選項(xiàng)被勾選。這會(huì)為類庫生成一個(gè)GUID,并將其注冊為COM組件。
例如,創(chuàng)建一個(gè)C#類庫項(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工具將其注冊為COM組件:
下面展示一些 內(nèi)聯(lián)代碼片。
regasm MyCSharpLibrary.dll /codebase
2.在C++中調(diào)用COM組件
在C++代碼中,通過COM接口調(diào)用C#類庫中的方法:
下面展示一些 內(nèi)聯(lián)代碼片。
#include <iostream>
#import "MyCSharpLibrary.tlb" // 導(dǎo)入類型庫文件
int main()
{
CoInitialize(NULL); // 初始化COM庫
IMyClassPtr myClass(__uuidof(MyClass)); // 創(chuàng)建COM對象
myClass->MyMethod(); // 調(diào)用方法
CoUninitialize(); // 釋放COM庫
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)目中添加對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#類庫
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)用的場景,但需要額外的注冊和配置。
C++/CLI:適合需要在C++中直接調(diào)用托管代碼的場景,代碼更簡潔。
P/Invoke:適合C#導(dǎo)出非托管接口的場景,調(diào)用方式更接近原生C++。
到此這篇關(guān)于C++項(xiàng)目中調(diào)用C#DLL的三種方式的文章就介紹到這了,更多相關(guān)C++調(diào)用C# DLL內(nèi)容請搜索腳本之家以前的文章或繼續(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)庫(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-09
Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南
Qt SQL模塊為數(shù)據(jù)庫提供了編程支持,Qt支持很多種常見的數(shù)據(jù)庫,如 MySQL Oracle、MS SQL Server、SQLite等,下面這篇文章主要介紹了這篇文章主要給大家介紹了關(guān)于Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南的相關(guān)資料,需要的朋友可以參考下2022-08-08
C語言數(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-11
C++代碼實(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

