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. PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)

    给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...

  2. Linux shell unzip和tar 批量解压文件

    #!/bin/sh UNTAR="tar -xvf " #unzip all zip files function unzip_all_file() { for i in *.zi ...

  3. C语言实现 循环队列

    #include <stdio.h>#include <stdlib.h>#include <stdbool.h> typedef struct queue{ in ...

  4. Acer4315笔记本CPU升级

    终于有时间升级一下不怎么用的旧笔记本Acer4315了.在计划升级前了解了一下,芯片组是GL960,支持可升级的CPU有: CM560 CM570 T1600 T1700 T2310 T2330 T2 ...

  5. 手写数字识别——利用keras高层API快速搭建并优化网络模型

    在<手写数字识别——手动搭建全连接层>一文中,我们通过机器学习的基本公式构建出了一个网络模型,其实现过程毫无疑问是过于复杂了——不得不考虑诸如数据类型匹配.梯度计算.准确度的统计等问题,但 ...

  6. JavaScript 继承 -JavaScript高级程序设计

    oo(Object Oriented)面向对象 许多oo语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.函数没有签名,在ecmascript中无法实现接 ...

  7. OpenGL 编程指南 (5.2)

    1.使用纹理 GLSL从纹理中读取数据使用内置函数texture的多种重载方法 Gvec4 texture(gsampler1D, float texCoord[,float bias]) Gvec4 ...

  8. Silver Cow Party POJ - 3268

    #include<iostream> #include<queue> #include<cstring> using namespace std; +,INF=0x ...

  9. SQLyog使用教程

    详见链接:https://blog.csdn.net/qq_41520612/article/details/95474531 SQLyog连接MySQL时出现的2058错误解决方法 解决方法:win ...

  10. 分析器错误消息: Reference.svcmap:未能加载文件

    -------------- 缺少了:System.Web.Razor.dll