最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++項(xiàng)目中調(diào)用C#DLL的三種方式

 更新時(shí)間:2025年07月14日 09:59:35   作者:追烽少年x  
在C++中調(diào)用C#編寫的DLL,通常需要借助COM(技術(shù)或者通過C++/CLI來實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

方法一:使用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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    這篇文章主要介紹了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以參考下
    2017-04-04
  • C++ String部分成員模擬實(shí)現(xiàn)流程詳解

    C++ String部分成員模擬實(shí)現(xiàn)流程詳解

    我們先不直接實(shí)現(xiàn)完整版的string,先實(shí)現(xiàn)簡易版的string部分成員來基本了解下它的框架,以及以后來學(xué)習(xí)深淺拷貝的問題。這樣有循序漸進(jìn)的過程嘛
    2022-08-08
  • C語言簡單實(shí)現(xiàn)快速排序

    C語言簡單實(shí)現(xiàn)快速排序

    快速排序是一種不穩(wěn)定排序,這篇文章主要為大家詳細(xì)介紹了C語言簡單實(shí)現(xiàn)快速排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • c++ 排查內(nèi)存泄漏的妙招

    c++ 排查內(nèi)存泄漏的妙招

    這篇文章主要介紹了c++ 如何用輔助類排查內(nèi)存泄漏,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • Visual?C++?6.0添加一個(gè)對(duì)話框的實(shí)現(xiàn)步驟

    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ù)和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ù)傳遞問題

    關(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/C++之I/O性能優(yōu)化過程

    C/C++之I/O性能優(yōu)化過程

    C++I/O優(yōu)化需禁用同步、減少刷新次數(shù)、批量處理數(shù)據(jù),常用方法包括sync_with_stdio(false)、使用printf/scanf/fread、避免endl、stringstream緩存及文件一次性讀取,針對(duì)不同場景(算法競賽、大數(shù)據(jù)、文本處理)選擇合適策略,核心是降低I/O開銷與格式轉(zhuǎn)換成本
    2025-09-09
  • C語言的堆串操作詳解

    C語言的堆串操作詳解

    大家好,本篇文章主要講的是C語言的堆串操作詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C++有符號(hào)和無符號(hào)整數(shù)的位移操作過程

    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

最新評(píng)論

通江县| 沭阳县| 紫金县| 湖口县| 大化| 台前县| 明光市| 广昌县| 新蔡县| 武威市| 文登市| 阿尔山市| 蓬安县| 峨眉山市| 惠东县| 西安市| 垦利县| 靖宇县| 北海市| 马公市| 洞头县| 稷山县| 金乡县| 将乐县| 铜川市| 马关县| 清水县| 平利县| 河北省| 孝义市| 镇远县| 莒南县| 余姚市| 宣化县| 屏山县| 黄平县| 金昌市| 麻栗坡县| 永清县| 张北县| 巧家县|