C++/CLI剪辑
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剪辑的更多相关文章
- .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...
- 跨越语言的障碍:C++/CLI 调用 C#
首先我想投诉一下博客园首页右边栏的广告..最近总是出现很恐怖的整容脸的广告.真的是吓坏了.=.=大家有同感吗? 博客园前一阵子掀起了语言的广泛讨论,事实上语言的争执在整个程序员圈子也没有停止过.以我个 ...
- Ubuntu 安装 CLI 并运行 ASP.NET Core 1.0
Ubuntu 下载地址:http://www.ubuntu.org.cn/download/desktop 注:目前 CLI 的安装命令只支持 Ubuntu 14.04,暂不支持 Ubuntu 14. ...
- 『.NET Core CLI工具文档』(十四)dotnet-install 脚本参考
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-install scripts reference 翻译:dotnet-install 脚本参考 名称 d ...
- 『.NET Core CLI工具文档』(九)dotnet-run
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-run 翻译:dotnet-run 名称 dotnet-run -- 没有任何明确的编译或启动命令运行&q ...
- 『.NET Core CLI工具文档』(八)dotnet-restore
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-restore 翻译:dotnet-restore 名称 dotnet-restore - 还原一个项目的 ...
- 『.NET Core CLI工具文档』(七)dotnet-new
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-new 翻译:dotnet-new 名称 dotnet-new -- 创建一个新的 .NET Core 项 ...
- 『.NET Core CLI工具文档』(六)dotnet 命令
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet command 翻译:dotnet 命令 名称 dotnet -- 运行命令行命令的一般驱动程序 概要 d ...
- 『.NET Core CLI工具文档』(二).NET Core 工具遥测(应用信息收集)
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Tools Telemetry 翻译:.NET Core 工具遥测(应用信息收集) .NET Cor ...
随机推荐
- Python之pptx实现添加内容与删除(移动)页操作
问题背景 大量表格数据需要生成指定格式的ppt文件,内容以文字和表格为主,首尾页与内容有固定格式.博主不熟悉VBA操作,希望通过模板用Python完成自动化. 基本思路 使用xlrd模块读取xlsx文 ...
- mui下拉刷新上拉加载
新外卖商家端主页订单大厅页面 使用mui双webview,实现下拉刷新上拉加载 主页面: order_index.html <!doctype html> <html> < ...
- vConsole 让你在手机上也能轻松调试网页
有时候为了想在手机真机上对网页进行 Debug,可手机上没有 F12,用 Chrome DevTools 连接手机操作又太过复杂.VConsole 的出现,正好解决了这一痛点! (下列内容照搬一下官方 ...
- CSS 实现一个自适应的正方形
传统方法正方形用固定的形式写 直接长=宽写固定的值如下 .box{ width: 200px; height: 200px; background: pink; color: ...
- harbor仓库部署时启用https时的常见错误KeyError: 'certificate'等
出现 KeyError: 'certificate' 错误 先确认你的配置是否正确,例如harbor.yml里的https证书位置是否正确,证书是否正常无误 如果上述无误确反复报错,请确认你的harb ...
- linux--nginx学习
nginx 1.nginx安装编译 1.yum install nginx(自动解决依赖) 2.源代码编译安装(优秀,自由选择软件版本,自定义第三方功能比如开启https) 3.rpm手动安装(垃圾) ...
- @Configuration@Bean
https://blog.csdn.net/u014199143/article/details/80692685 @Configuation等价于<Beans></Beans> ...
- 一直报找不到function,然后又不为null。最后发现是个数组。哭死。
今天写代码,报找不到function.然后又不为空.最后发现是类型不对.因为是数组,所以不能用node.function(),而应该用nodeArr[0].function.错用前者会找不到funct ...
- 前端面试必备技巧(二)css盒模型及BFC
CSS盒模型 基本概念:标准模型+IE模型及区别 CSS如何设置这两种模型? JS如何设置获取盒模型对应的宽和高? 实例题(根据盒模型解释边距重叠) BFC边距重叠解决方案 (1)BFC的基本概念:b ...
- window10安装nginx及请求转发到tomcat服务器访问项目及开机自启
一.安装ngnix 1. 到nginx官网上下载相应的安装包,http://nginx.org/en/download.html: 下载进行解压,将解压后的文件放到自己心仪的目录下,我的解压文件放在 ...