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對(duì)象
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)目中添加對(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#類庫
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)容請(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)庫(dll文件)遇到的坑及解決
- C#程序如何調(diào)用C++?dll詳細(xì)教程
相關(guān)文章
C++ 中使用lambda代替 unique_ptr 的Deleter的方法
這篇文章主要介紹了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以參考下2017-04-04
C++ String部分成員模擬實(shí)現(xiàn)流程詳解
我們先不直接實(shí)現(xiàn)完整版的string,先實(shí)現(xiàn)簡易版的string部分成員來基本了解下它的框架,以及以后來學(xué)習(xí)深淺拷貝的問題。這樣有循序漸進(jìn)的過程嘛2022-08-08
Visual?C++?6.0添加一個(gè)對(duì)話框的實(shí)現(xiàn)步驟
VC6.0是微軟公司推出的一款集成開發(fā)環(huán)境,本文主要介紹了Visual?C++?6.0添加一個(gè)對(duì)話框的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
C語言中feof函數(shù)和ferror函數(shù)示例詳解
在C語言中feof函數(shù)用于檢查文件流的結(jié)束標(biāo)志,判斷文件在讀取時(shí)是否已經(jīng)到達(dá)了文件的末尾,這篇文章主要給大家介紹了關(guān)于C語言中feof函數(shù)和ferror函數(shù)的相關(guān)資料,需要的朋友可以參考下2024-09-09
關(guān)于python調(diào)用c++動(dòng)態(tài)庫dll時(shí)的參數(shù)傳遞問題
這篇文章主要介紹了python調(diào)用c++動(dòng)態(tài)庫dll時(shí)的參數(shù)傳遞,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C++有符號(hào)和無符號(hào)整數(shù)的位移操作過程
C++中位移操作對(duì)有符號(hào)與無符號(hào)整數(shù)處理不同:無符號(hào)左移補(bǔ)0,右移也補(bǔ)0;有符號(hào)右移補(bǔ)符號(hào)位(算術(shù)移位),左移可能觸發(fā)未定義行為,需注意類型轉(zhuǎn)換與跨平臺(tái)兼容性2025-09-09

