1.本地类中包含托管类成员变量的情况

 #include<vcclr.h>     // 必须包含vcclr.h头文件

 //传入

 A^ a = gcnew A();

 gcroot<A^> *pA = new gcroot<A^>();

 *pA = a;

 void *ptr = pA;

 B *b = new B(pA);  //c++类

 //还原

 gcroot<A^> *  m_pA = (gcroot<A^> *)pA;

 (*m_pA)->FuncA(); //可调用A类接口;

2.pin_ptr是防止您的对象移动将在垃圾回收堆的内部指针. 也就是说钉住指针的值不是由公共语言运行时更改. 当向非托管函数传递托管类的地址时,这很有用,因为在解析非托管函数调用的过程中,该地址不会意外更改.

pin_ptr无法使用情况(在pin_ptr的生命周期内有效):

    • 函数参数

    • 作为函数的返回类型。

    • 类成员的声明

    • 目标的类型约束。

pin_ptr 数组的第一个元素的位置
 // pin_ptr_1.cpp
// compile with: /clr
using namespace System;
#define SIZE 10 #pragma unmanaged
// native function that initializes an array
void native_function(int* p) {
for(int i = ; i < ; i++)
p[i] = i;
}
#pragma managed public ref class A {
private:
array<int>^ arr; // CLR integer array public:
A() {
arr = gcnew array<int>(SIZE);
} void load() {
pin_ptr<int> p = &arr[]; // pin pointer to first element in arr
int* np = p; // pointer to the first element in arr
native_function(np); // pass pointer to native function
} int sum() {
int total = ;
for (int i = ; i < SIZE ; i++)
total += arr[i];
return total;
}
}; int main() {
A^ a = gcnew A;
a->load(); // initialize managed array using the native function
Console::WriteLine(a->sum());
}
内部指针转换为钉住的指针,并且,类型为返回 address-of 运算符 (&) 是内部指针,当操作数在托管堆时
 // pin_ptr_2.cpp
// compile with: /clr
using namespace System; ref struct G {
G() : i() {}
int i;
}; ref struct H {
H() : j() {}
int j;
}; int main() {
G ^ g = gcnew G; // g is a whole reference object pointer
H ^ h = gcnew H; interior_ptr<int> l = &(g->i); // l is interior pointer pin_ptr<int> k = &(h->j); // k is a pinning interior pointer k = l; // ok
Console::WriteLine(*k);
};
钉住的指针转换为另一种类型
 // pin_ptr_3.cpp
// compile with: /clr
using namespace System; ref class ManagedType {
public:
int i;
}; int main() {
ManagedType ^mt = gcnew ManagedType;
pin_ptr< int > pt = &mt->i;
*pt = ;
Console::WriteLine(mt->i); char *pc = ( char* ) pt;
*pc = ;
Console::WriteLine(mt->i);
}

3.char * to array<unsigned char^>

 #pragma unmanaged

 void work_with_native_buffer(char* pBuffer, size_t size) {
// Do your unmanaged stuff here
} #pragma managed ref class Test {
public:
void DoNativeStuff() {
if (_buffer == nullptr)
_buffer = gcnew array<unsigned char>(); pin_ptr<int> pinnedBuffer = &_buffer[];
char* pBuffer = pinnedBuffer;
work_with_native_buffer(pBuffer, _buffer->Length);
} void SendData(Stream^ stream) {
Debug.Assert(_buffer != nullptr); stream->Write(_buffer, , _buffer->Length);
} private:
array<unsigned char>^ _buffer;
};

使用 C++/CLI (Visual C++) 进行 .NET 编程

C++/CLI剪辑的更多相关文章

  1. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  2. 跨越语言的障碍:C++/CLI 调用 C#

    首先我想投诉一下博客园首页右边栏的广告..最近总是出现很恐怖的整容脸的广告.真的是吓坏了.=.=大家有同感吗? 博客园前一阵子掀起了语言的广泛讨论,事实上语言的争执在整个程序员圈子也没有停止过.以我个 ...

  3. Ubuntu 安装 CLI 并运行 ASP.NET Core 1.0

    Ubuntu 下载地址:http://www.ubuntu.org.cn/download/desktop 注:目前 CLI 的安装命令只支持 Ubuntu 14.04,暂不支持 Ubuntu 14. ...

  4. 『.NET Core CLI工具文档』(十四)dotnet-install 脚本参考

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-install scripts reference 翻译:dotnet-install 脚本参考 名称 d ...

  5. 『.NET Core CLI工具文档』(九)dotnet-run

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-run 翻译:dotnet-run 名称 dotnet-run -- 没有任何明确的编译或启动命令运行&q ...

  6. 『.NET Core CLI工具文档』(八)dotnet-restore

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-restore 翻译:dotnet-restore 名称 dotnet-restore - 还原一个项目的 ...

  7. 『.NET Core CLI工具文档』(七)dotnet-new

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-new 翻译:dotnet-new 名称 dotnet-new -- 创建一个新的 .NET Core 项 ...

  8. 『.NET Core CLI工具文档』(六)dotnet 命令

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet command 翻译:dotnet 命令 名称 dotnet -- 运行命令行命令的一般驱动程序 概要 d ...

  9. 『.NET Core CLI工具文档』(二).NET Core 工具遥测(应用信息收集)

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Tools Telemetry 翻译:.NET Core 工具遥测(应用信息收集) .NET Cor ...

随机推荐

  1. 20200228 尚硅谷-NIO

    尚硅谷-NIO Java NIO简介 Java NIO(New IO.Non Blocking IO)是从Java1.4版本开始引入的新的 IO API,可以替代标准的 Java IO API. NI ...

  2. Centos 安装 Go 编译环境

    1.下载go(最新版列表 https://studygolang.com/dl) wget -c https://studygolang.com/dl/golang/go1.13.5.linux-am ...

  3. 开发FTP服务接口,对外提供接口服务

    注意:本文只适合小文本文件的上传下载,因为post请求是有大小限制的.默认大小是2m,虽然具体数值可以调节,但不适合做大文件的传输 最近公司有这么个需求:以后所有的项目开发中需要使用ftp服务器的地方 ...

  4. C# 调用APlayer教程

    APlayer介绍 引擎介绍: APlayer 媒体播放引擎是迅雷公司从 年开始开发的通用音视频媒体文件播放内核. 迅雷看看播放器和迅雷影音就是使用 APlayer 作为播放内核,目前迅雷看看播放器在 ...

  5. 在csv表格中修改/追加某行数据

    思路: 文本文件不能随意穿插信息,但是通过使用Seek()方法,可以在读取文本文件中移动光标从而修改所要修改的行. 思路步骤: 1.读取文件,打开csv文件,获取文件流,seek移动光标到开始, fo ...

  6. 手写MyBatis流程

    MyBatis 手写MyBatis流程 架构流程图 封装数据 封装到Configuration中 1.封装全局配置文件,包含数据库连接信息和mappers信息 2.封装*mapper.xml映射文件 ...

  7. c#枚举转字典或表格

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机

    动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...

  9. ElementUI的Table-column_render-header自定义表头

    ElementUI的Table表格,官方网站上提供了很多样式,但是在日常开发中还会碰到各种情况,显然官方提供的是不能满足需求的.那么,我们就根据自己的需求对table进行改造. 先丢出关于Table的 ...

  10. 题解 P5712 【【深基3.例4】Apples】

    题目传送门 思路 仔细读题后,我们可以发现,输出可以分成\(2\)种情况,apple加s与apple不加s,所以我们可以使用if/else来实现. 接着,我们读入n. int n; cin>&g ...