日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

利用 C++ Interop 封装 ISO C++ 对象, 供其他 .Net 语言使用

發(fā)布時(shí)間:2025/6/15 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用 C++ Interop 封装 ISO C++ 对象, 供其他 .Net 语言使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

???? .Net BCL 支持兩種互操作技術(shù),模塊 級(jí)重用 P/Invoke 和組件級(jí)重用COM 互操作,

?

C++/CLI 除了支持以上兩種互操作以外,更支持代碼級(jí)重用, 稱為 C++ Interop,本文

?

僅舉例說(shuō)明這種互操作技術(shù)。本例使用 ISO C++ 建立一個(gè)類 NativeLib, 計(jì)算并打印

?

兩個(gè)位置的直線距離,然后使用 C++/CLI 封裝在一個(gè) NativeLibWrap 托管類里,提

?

供給 C# 主程序調(diào)用。

?

// NativeLib.h (ISO C++)

#include <iostream>

#include <cmath>

using namespace std;

?

public struct Location

{

??? Location(double x, double y) : X(x), Y(y) { }

??? double X;

??? double Y;

};

?

public class NativeLib

{

public:

??? NativeLib(Location&, Location&);

??? void PrintDistance() const;

private:

??? Location firstLocation;

??? Location secondLocation;

??? double GetDistance() const;

};

?

// NativeLib.cpp (ISO C++)

#include "NativeLib.h"

?

NativeLib::NativeLib(Location& firstLocation, Location& secondLocation) :

??? firstLocation(firstLocation), secondLocation(secondLocation) {

}

?

double NativeLib::GetDistance() const {

??? double dx = firstLocation.X - secondLocation.X;

??? double dy = firstLocation.Y - secondLocation.Y;

??? double distance = sqrt(dx * dx + dy * dy);

???

??? return distance;

}

?

void NativeLib::PrintDistance() const {

??? cout << "The distance is " << GetDistance() << endl;

}

?

以上是 ISO C++ 代碼,要在為了在托管平臺(tái) 下使用,定義一個(gè)包裝類 NativeLibWrap

?

它引用一個(gè) NativeLib ISO C++)對(duì)象的指針,注意一個(gè)托管 對(duì)象不能直接包含一

?

個(gè)本地(ISO C++)對(duì)象,只能使用指針,這是 由垃圾收集機(jī)制決定的,本地堆內(nèi)存屬于

?

非托管資源,因此 NativeLibWrap 類實(shí)現(xiàn)了 Dispose 模式,請(qǐng)參考我的另一篇博客

?

—— .Net Dispose 模式與 C++/CLI 確定性資源清理

?

// NativeLibWrap.h (C++/CLI)

#pragma once

#include "NativeLib.h"

?

public value struct LocationWrap

{

??? LocationWrap(double x, double y) : X(x), Y(y) { }

??? double X;

??? double Y;

};

?

public ref class NativeLibWrap

{

public:

??? NativeLibWrap(LocationWrap, LocationWrap);

??? ~NativeLibWrap();

??? void PrintDistance();

protected:

??? !NativeLibWrap();

private:

??? NativeLib* nativeLib;

};

?

// NativeLibWrap.cpp (C++/CLI)

#incude "NativeLibWrap.h"

?

NativeLibWrap::NativeLibWrap(LocationWrap firstLocationWrap, LocationWrap secondLocationWrap) {

??? Location firstLocation(firstLocationWrap.X, firstLocationWrap.Y);

??? Location secondLocation(secondLocationWrap.X, secondLocationWrap.Y);

??? this->nativeLib = new NativeLib(firstLocation, secondLocation);

}

?

NativeLibWrap::~NativeLibWrap() {

??? this->!NativeLibWrap();

}

?

NativeLibWrap::!NativeLibWrap() {

??? delete nativeLib;

}

?

void NativeLibWrap::PrintDistance() {

??? this->nativeLib->PrintDistance();

}

?

Compile the four files with:

cl /clr /LD NativeLibWrap.cpp NativeLib.cpp

將產(chǎn)生NativeLibWrap.dll

?

// NativeLibWrapTest.cs (C#)

internal static class NativeLibWrapTest

{

??? private static void Main() {

??????? LocationWrap firstLocation = new LocationWrap(1, 1);

??????? LocationWrap secondLocation = new LocationWrap(4, 5);

??????? NativeLibWrap nativeLibWrap = new NativeLibWrap(firstLocation,?

????????????secondLocation);

??????? nativeLibWrap.PrintDistance();

??????? nativeLibWrap.Dispose();

??? }

}

?

Compile with:

csc /r:NativeLibWrap.dll NativeLibWrapTest.cs

輸出NativeLibWrapTest.exe

?

運(yùn)行, 輸出The distance is 5

?

??? 對(duì)于ISO C++ 自定義的struct, enum 等類型,為了在其他.Net 語(yǔ)言中調(diào)用,需要重新定義為

?

value struct (value class), enum class 等,如果只是在C++/CLI中使用,則不需要重新定

?

義,因?yàn)?/span>C++/CLI 支持ISO C++ 與托管代碼的混合編程。

?

??? C++/CLI 也支持在本地類型中訪問托管對(duì)象,需要使用gcroot 模板,也比較簡(jiǎn)單,可以查閱MSDN

?????

相關(guān)文檔說(shuō)明,本文不再綴述。

轉(zhuǎn)載于:https://my.oschina.net/duluo180/blog/8498

總結(jié)

以上是生活随笔為你收集整理的利用 C++ Interop 封装 ISO C++ 对象, 供其他 .Net 语言使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。