文档章节

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

Yong_Luo
 Yong_Luo
发布于 2010/10/01 10:18
字数 615
阅读 459
收藏 1

     .Net BCL 支持两种互操作技术,模块 级重用 P/Invoke 和组件级重用COM 互操作,

 

C++/CLI 除了支持以上两种互操作以外,更支持代码级重用, 称为 C++ Interop,本文

 

仅举例说明这种互操作技术。本例使用 ISO C++ 建立一个类 NativeLib, 计算并打印

 

两个位置的直线距离,然后使用 C++/CLI 封装在一个 NativeLibWrap 托管类里,提

 

供给 C# 主程序调用。

 

// 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++ 代码,要在为了在托管平台 下使用,定义一个包装类 NativeLibWrap

 

它引用一个 NativeLib ISO C++)对象的指针,注意一个托管 对象不能直接包含一

 

个本地(ISO C++)对象,只能使用指针,这是 由垃圾收集机制决定的,本地堆内存属于

 

非托管资源,因此 NativeLibWrap 类实现了 Dispose 模式,请参考我的另一篇博客

 

—— .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

将产生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

 

运行, 输出The distance is 5

 

    对于ISO C++ 自定义的struct, enum 等类型,为了在其他.Net 语言中调用,需要重新定义为

 

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

 

义,因为C++/CLI 支持ISO C++ 与托管代码的混合编程。

 

    C++/CLI 也支持在本地类型中访问托管对象,需要使用gcroot 模板,也比较简单,可以查阅MSDN

     

相关文档说明,本文不再缀述。

本文转载自:http://archive.cnblogs.com/a/1027417/

Yong_Luo
粉丝 13
博文 123
码字总数 1875
作品 0
海淀
私信 提问
一个典型的 C++ 程序员成长经历

1. 完整的学一遍 C++ 所有语言特性,典型书籍 "The C++ Programming Language" Part1, Part2, "C++ Primer" 感觉 C++ 像大杂烩(多编程范型),各种精妙的语法特性 (friend, virtual/RTTI, c......

晨曦之光
2012/05/16
492
0
C++17 标准正式发布:开发者可更简单地编写和维护代码

昨日,ISO C++ 委员会正式发布了 C++ 17 标准,正式名称为 ISO/IEC 14882:2017。 基于 C++ 11,C++ 17 旨在使 C++ 成为一个不那么臃肿复杂的编程语言,以简化该语言的日常使用,使开发者可以...

局长
2017/12/06
9.6K
43
典型的 C++ 程序员成长经历

一个典型的 C++ 程序员成长经历: 1. 完整的学一遍 C++ 所有语言特性,典型书籍 "The C++ Programming Language" Part1, Part2, "C++ Primer" 感觉 C++ 像大杂烩(多编程范型),各种精妙的语......

晨曦之光
2012/05/23
318
0
一 C家族的故事

一 C家族的故事 以下描述摘自《C++对话系列》 “最初,计算机语言非常混乱,高级语言根本不存在,连固定的语言形式也没有。贝尔实验室的Richard Martin在使用了计算机语言的过程中意识到了高...

长平狐
2012/08/28
450
0
C++ 类库资源

原文:C++ 类库资源 作者:Breaker C/C++ 开发库 | C/C++ Development Library 这里收集一些著名的 C/C++ 开发库、SDK、类库、可复用类与结构代码 等信息,列举它们的介绍、参考和网站链接,...

晨曦之光
2012/05/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
28分钟前
4
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
39分钟前
2
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
39分钟前
3
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
45分钟前
6
0
IDEA 自定义方法注解模板

IDEA 自定义方法注解模板 1、使用效果 /*** 计算交易费用* @Author wangjiafang* @Date 2019/9/11* @param feeComputeVo* @return*/@PostMapping("/v1/fee_compute")public ApiResp......

小白的成长
45分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部