当前位置: 首页 > news >正文

用于管理共享内存的 C# 类 ShareMemory

可以在 Windows 和 Linux 上运行,利用了 .NET Core 的 System.IO.MemoryMappedFiles 库。这个类实现了共享内存的创建、打开、读取和写入功能。以下是对代码的一些分析和建议改进。

代码分析

  1. 初始化与打开共享内存:

    • Init 方法用于创建新的共享内存段。
    • OpenMem 方法用于打开已存在的共享内存段。
    • 这两个方法都处理了异常并返回状态码,非常适合用于错误处理。
  2. 关闭共享内存:

    • Close 方法确保释放资源,避免内存泄漏。
  3. 读写数据:

    • Read 和 Write 方法提供了数据读写的功能,支持指定偏移量和大小。
  4. 状态管理:

    • _isInitialized 和 _isOpened 标志用于跟踪共享内存的状态。
using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;namespace MemoryDB
{class Class_ShareMemory{private MemoryMappedFile _memoryMappedFile;private MemoryMappedViewAccessor _viewAccessor;private long _memSize;private string _name;private bool _isInitialized;private bool _isOpened;public Class_ShareMem(){_isInitialized = false;_isOpened = false;}/// <summary>/// 初始化共享内存/// </summary>/// <param name="name">共享内存名称</param>/// <param name="size">共享内存大小</param>/// <returns></returns>public int Init(string name, long size){if (size <= 0) size = 0x00800000; // Default size_memSize = size;_name = name;try{// 根据操作系统设置共享内存名称string fullName = GetFullMemoryMappedFileName(_name);_memoryMappedFile = MemoryMappedFile.CreateNew(fullName, _memSize);_viewAccessor = _memoryMappedFile.CreateViewAccessor();_isInitialized = true;}catch (Exception ex){Console.WriteLine($"创建共享内存失败: {ex.Message}");return 2; // 创建失败}return 0; // 创建成功}/// <summary>/// 打开共享内存/// </summary>public int OpenMem(string name, long size){if (size <= 0) size = 0x00800000; // Default size_memSize = size;_name = name;try{// 根据操作系统设置共享内存名称string fullName = GetFullMemoryMappedFileName(_name);_memoryMappedFile = MemoryMappedFile.OpenExisting(fullName);_viewAccessor = _memoryMappedFile.CreateViewAccessor();_isOpened = true;}catch (Exception ex){Console.WriteLine($"打开共享内存失败: {ex.Message}");return 1; // 打开失败}return 0; // 打开成功}/// <summary>/// 关闭共享内存/// </summary>public void Close(){_viewAccessor?.Dispose();_memoryMappedFile?.Dispose();_isInitialized = false;_isOpened = false;}/// <summary>/// 读数据/// </summary>/// <param name="data">数据</param>/// <param name="offset">起始地址</param>/// <param name="size">个数</param>/// <returns></returns>public int Read(ref byte[] data, long offset, int size){if (offset + size > _memSize) return 2; // 超出数据区if (_isInitialized || _isOpened){_viewAccessor.ReadArray(offset, data, 0, size);}else{return 1; // 共享内存未初始化}return 0; // 读成功}/// <summary>/// 写数据/// </summary>/// <param name="data">数据</param>/// <param name="offset">起始地址</param>/// <param name="size">个数</param>/// <returns></returns>public int Write(byte[] data, long offset, int size){if (offset + size > _memSize) return 2; // 超出数据区if (_isInitialized || _isOpened){_viewAccessor.WriteArray(offset, data, 0, size);}else{return 1; // 共享内存未初始化}return 0; // 写成功}/// <summary>/// 根据操作系统获取完整的共享内存名称/// </summary>/// <param name="name">共享内存名称</param>/// <returns>完整的共享内存名称</returns>private string GetFullMemoryMappedFileName(string name){// 在 Windows 中使用 Global 前缀,在 Linux 中不使用if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)){return $"Global\\{name}";}else{return name; // Linux 上直接使用名称}}}
}

相关文章:

  • 9-社区动态(Stack布局)
  • 探秘鸿蒙 HarmonyOS NEXT:Navigation 组件的全面解析
  • HarmonyOS5云服务技术分享--账号登录文章整理
  • cv2.VideoWriter_fourcc(*‘mp4v‘)生成的视频无法在浏览器展
  • 基于 STM32 的蔬菜智能育苗系统硬件与软件设计
  • Go语言使用通义灵码辅助开发 - AI编程助手提升效率
  • 经典Java面试题的答案——Java 基础
  • Kotlin 协程 (一)
  • 【Linux】初见,基础指令(续)
  • 获取文件夹下所有文件的名称
  • Datawhale PyPOTS时间序列5月第4次笔记
  • Docker run -v 的 rw 和 ro 模式_docker ro
  • shp2pgsql 导入 Shp 到 PostGIS 空间数据库
  • MVDR源码(可直接运行)
  • Jmeter(一) - 环境搭建
  • 小白的进阶之路系列之二----人工智能从初步到精通pytorch中分类神经网络问题详解
  • 3D几何建模引擎3D ACIS Modeler核心功能深度解读
  • 视觉语言模型之困:当否定词成为理解的“盲区”
  • 【AI 大模型】盘古大模型简介 ( 创建空间 | 体验模型 | 部署模型 )
  • AMO——下层RL与上层模仿相结合的自适应运动优化:让人形行走操作(loco-manipulation)兼顾可行性和动力学约束
  • 区域、学校、课堂联动,上海浦东让AI素养培育贯穿基础教育全学段
  • 兴业证券:下半年A股指数稳、结构牛,中国资产重估刚刚开始
  • 重庆对外经贸学院通报:一学生在体育课后不慎坠入化粪池,不幸遇难
  • 上海中心城区首条“定制化低空观光航线”启航,可提前一天提需求
  • 推动粒子治疗更加可及可享!龚正调研上海市质子重离子医院
  • 秦洪看盘|小市值股领涨,A股交易情绪复苏