C# 中的 IntPtr

C# 中的 IntPtr

IntPtr 是 C# 中用于表示指针或句柄的结构,它在处理非托管代码、与 Windows API 交互或管理非托管资源时非常有用。IntPtr 是一个平台无关的类型,能够在 32 位和 64 位系统之间自适应,通常用于存储指针地址或句柄。

特点
  1. 平台无关性IntPtr 在 32 位和 64 位应用程序中能够适应不同的指针大小。
  2. 操作:提供了多种方法和运算符用于处理指针运算,如加减法等。
  3. 内存管理:常与 Marshal 类一起使用,用于处理非托管内存的分配和释放。

示例 1: C# 创建 IntPtr 并释放

1. C++ 代码

首先,创建一个简单的 C++ 动态链接库(DLL)。以下是一个名为 MyLibrary.cpp 的 C++ 文件:

// MyLibrary.cpp
extern "C" {__declspec(dllexport) void SetValue(int* ptr, int value) {if (ptr) {*ptr = value; // 设置值}}__declspec(dllexport) int GetValue(int* ptr) {if (ptr) {return *ptr; // 获取值}return 0; // 指针为空返回 0}
}

编译上面的 C++ 代码为动态链接库 MyLibrary.dll

2. C# 代码

接下来,在 C# 项目中调用上面的 C++ 函数。以下是示例代码:

using System;
using System.Runtime.InteropServices;class Program
{// 导入 C++ 函数[DllImport("MyLibrary.dll", CallingConvention = CallingConvention.Cdecl)]public static extern void SetValue(IntPtr ptr, int value);[DllImport("MyLibrary.dll", CallingConvention = CallingConvention.Cdecl)]public static extern int GetValue(IntPtr ptr);static void Main(string[] args){// 分配内存IntPtr ptr = Marshal.AllocHGlobal(sizeof(int));try{// 使用 C++ 函数设置值SetValue(ptr, 42);// 使用 C++ 函数获取值int value = GetValue(ptr);Console.WriteLine($"Value from C++: {value}");}finally{// 释放内存Marshal.FreeHGlobal(ptr);}}
}

Demo 2: C++ 创建 IntPtr 并释放

首先,创建一个 C++ 动态链接库(DLL),在其中分配和释放内存。以下是 MyLibrary.cpp 的示例代码:

// MyLibrary.cpp
#include <iostream>extern "C" {__declspec(dllexport) int* CreateIntPtr() {// 在 C++ 中创建并分配内存int* ptr = new int(200); // 分配内存并初始化为 200return ptr; // 返回指针}__declspec(dllexport) void ReleaseIntPtr(int* ptr) {// 释放内存delete ptr;std::cout << "Memory released in C++." << std::endl;}__declspec(dllexport) int GetValue(int* ptr) {// 获取值return *ptr;}
}

C# 调用 C++ Demo

接下来,我们在 C# 中调用 C++ 函数。以下是 C# 代码:

using System;
using System.Runtime.InteropServices;class Program
{// 导入 C++ 函数[DllImport("MyLibrary.dll", CallingConvention = CallingConvention.Cdecl)]public static extern IntPtr CreateIntPtr();[DllImport("MyLibrary.dll", CallingConvention = CallingConvention.Cdecl)]public static extern void ReleaseIntPtr(IntPtr ptr);[DllImport("MyLibrary.dll", CallingConvention = CallingConvention.Cdecl)]public static extern int GetValue(IntPtr ptr);static void Main(string[] args){// 调用 C++ 函数创建 IntPtrIntPtr ptr = CreateIntPtr();// 从 C++ 中获取值int value = GetValue(ptr);Console.WriteLine($"Value from C++: {value}");// 调用 C++ 函数释放 IntPtrReleaseIntPtr(ptr);}
}

总结

这两个示例展示了如何在 C# 和 C++ 中分别创建和释放 IntPtr。在示例1中,IntPtr 是在托管环境中创建并释放的,而在示例2中,IntPtr 是在非托管环境中创建并释放的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode通过remote-ssh连接远程开发机

文章目录 安装扩展注意事项:tips其他参数安装扩展 安装VS Code和SSH-Remote扩展:首先,需要确保你已经在本地计算机上安装了VS Code,并且在扩展市场中搜索并安装了"Remote - SSH"扩展。配置SSH:在本地计算机上,打开VS Code的命令面板(使用快捷键"Ctrl+Shi…

Golang | Leetcode Golang题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…

关于CountDownLatch失效问题

一、项目背景 这几天要开发一个类似支付宝那种年度账单统计的功能&#xff0c;就是到元旦后支付完会把用户这一年的消费情况从各个维度&#xff08;我们把这一个维度称作一个指标&#xff09;统计分析形成一张报告展示给用户。 这个功能实现用到了CountDownLatch。假如统计分析…

ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 自己在通过 pip install 安装module时 &#xff08;使用的是 pip install mmcv&#xff09;遇到如下问题&#xff1a; ImportError: cannot …

「Mac畅玩鸿蒙与硬件30」UI互动应用篇7 - 简易计步器

本篇将带你实现一个简易计步器应用&#xff0c;用户通过点击按钮增加步数并实时查看步数进度&#xff0c;目标步数为 10000 步。该项目示例展示了如何使用 Progress 组件和 Button 组件&#xff0c;并结合状态管理&#xff0c;实现交互式应用。 关键词 UI互动应用计步器Button…

项目功能--套餐预约占比饼形图

一、需求分析 会员可以通过移动端自助进行体检预约&#xff0c;在预约时需要选择预约的体检套餐。我们要通过饼形图直观的展示出会员预约的各个套餐占比情况。 二、代码实现 实现步骤&#xff1a; 步骤一&#xff1a;将echarts.js文件复制到工程的plugins目录下 步骤二&…

多媒体信息检索

文章目录 一、绪论二、文本检索 (Text Retrieval)(一) 索引1.倒排索引2.TF-IDF (二) 信息检索模型 (IR模型&#xff0c;Information Retrieval)1.布尔模型 (Boolean模型)(1)扩展的布尔模型 (两个词)(2)P-Norm模型 (多个词) 2.向量空间模型 (Vector Space Model&#xff0c;VSM)…

gan的所有种类,人工智能 机器学习,gan的所有算法

参考最全汇总GAN网络及其各种变体&#xff08;附论文及代码实现&#xff09;_gan网络代码-CSDN博客 这是我找到的关于您提问的答案: 1. **GAN类型**: Auxiliary Classifier GAN **参考论文**: 《Conditional Image Synthesis With Auxiliary Classifier GANs》 **代码地址**: …

【漏洞复现】万户OA-ezOFFICE getAutoCode.jsp Sql注入漏洞

免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…

在vscode中如何利用git 查看某一个文件的提交记录

在 Visual Studio Code (VSCode) 中&#xff0c;你可以使用内置的 Git 集成来查看某个文件的提交历史。以下是具体步骤&#xff1a; 使用 VSCode 内置 Git 功能 打开项目&#xff1a; 打开你的项目文件夹&#xff0c;确保该项目已经是一个 Git 仓库&#xff08;即项目根目录下…

vue2 -- el-form组件动态增减表单项及表单项验证

需求 在数据录入场景(如订单信息录入)中,可根据实际情况(如商品种类增加)动态添加表单项(如商品相关信息)。包含必填项验证和数据格式验证(如邮箱、电话格式),防止错误数据提交。 效果 代码一 <template><div>

【uiautomator】自动化测试camera【一】

文章目录 1 概述2 准备工作3 写个demo 1 概述 本文档是自己写andorid camera自动化测试的随笔 测试机器为 OPPO Find x7 测试Apk为oppo的系统相机. 2 准备工作 我电脑是有装conda环境的,所以我直接用conda创建虚拟环境专门用于相关的测试. https://mirrors.tuna.tsinghua.ed…

使用 Elasticsearch 构建食谱搜索(一)

作者&#xff1a;来自 Elastic Andre Luiz 了解如何使用 Elasticsearch 构建基于语义搜索的食谱搜索。 简介 许多电子商务网站都希望增强其食谱搜索体验。正确使用语义搜索可以让客户根据更自然的查询&#xff08;例如 “something for Valentines Day - 情人节的礼物” 或 “…

SystemVerilog学习笔记(七):函数与任务

函数 函数的主要用途是编写一段可以随时调用n次的代码&#xff0c;只需调用函数名即可&#xff0c;不需要任何模拟时间来执行。函数是返回类型&#xff0c;仅返回函数声明中提到的单个值&#xff0c;如果未声明则返回一个位的值。 语法&#xff1a; initial begin functio…

物理验证Calibre LVS | SMIC Process过LVS时VNW和VPW要如何做处理?

SMIC家工艺的数字后端实现PR chipfinish写出来的带PG netlist如下图所示。我们可以看到标准单元没有VNW和VPW pin的逻辑连接关系。 前几天小编在社区星球上分享了T12nm ananke_core CPU低功耗设计项目的Calibre LVS案例&#xff0c;就是关于标准单元VPP和VBB的连接问题。 目前…

【编程概念基础知识】

、编程基础 一、面向对象的三大特性 1、封装&#xff1a; 盒子、零件、按钮 隐藏对象 的内部状态&#xff0c;并且只通过对象的方法来访问数据 想象你有一个小盒子&#xff08;这个盒子就是一个类&#xff09;&#xff0c;里面装着一些零件&#xff08;这些零件就是数据&a…

Oracle 第23章:大数据与NoSQL集成

第23章 大数据与NoSQL集成 在当今的数字化时代&#xff0c;数据量的爆炸性增长给传统的关系型数据库带来了前所未有的挑战。为了应对这些挑战&#xff0c;NoSQL&#xff08;Not Only SQL&#xff09;数据库应运而生&#xff0c;它提供了灵活的数据模型和可扩展的架构来处理大规…

纯前端实现在线预览excel文件(插件: LuckyExcel、Luckysheet)

概述 在实际开发中&#xff0c;遇到需要在线预览各种文件的需求&#xff0c;最近遇到在线预览excel文件的需求&#xff0c;在此记录一下&#xff01;本文主要功能实现&#xff0c;用于插件 LuckyExcel &#xff0c;Luckysheet&#xff01;废话不多说&#xff0c;上代码&#xf…

实验05多重循环---7-09 打印金字塔图案

打印一个由 m 行字符 * 组成的金字塔形图案。 输入格式: 输入一个整数&#xff0c;表示行数 m&#xff0c;其中 m 满足 2≤m≤10。 输出格式: 由字符 * 组成的 m 行金字塔形图案。 输入样例: 5 输出样例: **************** *********//自己写的 #define _CRT_SECURE_NO_WAR…

LocalDate和LocalDateTime类

在Java 8中引入的LocalDate表示一个格式为yyyy-MM-dd的日期&#xff0c;如2024-06-13。它不存储时间或时区。我们可以从LocalDate中获取许多其他的日期字段&#xff0c;如年日(day-of-year)、周日(day-of-week)、月日(month-of-year)等等。 1 初始化 LocalDate以年月日的格式输…