C# 共享内存(转)

摘要:
下面是一个C#操作内存类。只要将以下类添加到相应的项目中,该项目就可以直接对内存进行操作!

以下是一个C#操作内存的一个类,只要将下面的类添加到相应的项目中,该项目就可以对内存进行直接操作!

using System.Runtime.InteropServices;    //添加如下命名空间 需要是用 DllImport

public class ShareMemLib
    {

   [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr CreateFileMapping(int hFile, IntPtr lpAttributes, uint flProtect, uint dwMaxSizeHi, uint dwMaxSizeLow, string lpName);

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr OpenFileMapping(int dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, string lpName);

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr MapViewOfFile(IntPtr hFileMapping, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, uint dwNumberOfBytesToMap);

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]

        public static extern bool UnmapViewOfFile(IntPtr pvBaseAddress);

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]

        public static extern bool CloseHandle(IntPtr handle);

        [DllImport("kernel32", EntryPoint = "GetLastError")]

        public static extern int GetLastError();

        const int ERROR_ALREADY_EXISTS = 183;

        const int FILE_MAP_COPY = 0x0001;

        const int FILE_MAP_WRITE = 0x0002;

        const int FILE_MAP_READ = 0x0004;

        const int FILE_MAP_ALL_ACCESS = 0x0002 | 0x0004;

        const int PAGE_READONLY = 0x02;

        const int PAGE_READWRITE = 0x04;

        const int PAGE_WRITECOPY = 0x08;

        const int PAGE_EXECUTE = 0x10;

        const int PAGE_EXECUTE_READ = 0x20;

        const int PAGE_EXECUTE_READWRITE = 0x40;

        const int SEC_COMMIT = 0x8000000;

        const int SEC_IMAGE = 0x1000000;

        const int SEC_NOCACHE = 0x10000000;

        const int SEC_RESERVE = 0x4000000;

        const int INVALID_HANDLE_VALUE = -1;

        IntPtr m_hSharedMemoryFile = IntPtr.Zero;

        IntPtr m_pwData = IntPtr.Zero;

        bool m_bAlreadyExist = false;

        bool m_bInit = false;

        long m_MemSize = 0;

        public ShareMemLib()

        {

        }

        ~ShareMemLib()

        {

            Close();

        }

       //初始化内存

        public int Init(string strName, long lngSize)

        {

            if (lngSize <= 0 || lngSize > 0x00800000) lngSize = 0x00800000;

            m_MemSize = lngSize;

            if (strName.Length > 0)

            {

                //创建内存共享体(INVALID_HANDLE_VALUE)

                m_hSharedMemoryFile = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, (uint)PAGE_READWRITE, 0, (uint)lngSize, strName);

                if (m_hSharedMemoryFile == IntPtr.Zero)

                {

                    m_bAlreadyExist = false;

                    m_bInit = false;

                    return 2; //创建共享体失败

                }

                else

                {

                    if (GetLastError() == ERROR_ALREADY_EXISTS)  //已经创建

                    {

                        m_bAlreadyExist = true;

                    }

                    else           

                    {

                        m_bAlreadyExist = false;

                    }

                }

                //创建内存映射

                m_pwData = MapViewOfFile(m_hSharedMemoryFile, FILE_MAP_WRITE, 0, 0, (uint)lngSize);

                if (m_pwData == IntPtr.Zero)

                {

                    m_bInit = false;

                    CloseHandle(m_hSharedMemoryFile);

                    return 3; //创建内存映射失败

                }

                else

                {

                    m_bInit = true;

                    if (m_bAlreadyExist == false)

                    {

                    }

                }            

}

            else

            {

                return 1;    

            }

            return 0;     

        }

      //关闭共享内存

        public void Close()

        {

            if (m_bInit)

            {

                UnmapViewOfFile(m_pwData);

                CloseHandle(m_hSharedMemoryFile);

            }

        }

         ///读数据

        public int Read(ref byte[] bytData, int lngAddr, int lngSize)

        {

            if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区

            if (m_bInit)

            {

                Marshal.Copy(m_pwData, bytData, lngAddr, lngSize);

            }

            else

            {

                return 1;

            }

            return 0;    

        }

       //将数据写入共享内存中

        public int Write(byte[] bytData, int lngAddr, int lngSize)

        {

            if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区

            if (m_bInit)

            {

                Marshal.Copy(bytData, lngAddr, m_pwData, lngSize);

            }

            else

            {

                return 1;

            }

            return 0;    

        }

调用方法:

 声明   ShareMemery.ShareMemLib MemDB = new ShareMemLib();  为公共的变量

//用下面这句话调用上面类中的初始化共享内存的方法

 if (MemDB.Init("YFMemTest", 10240) != 0) 

将需要写在内存中的数据:转化成为byte[]

 MemDB.Write(bytData, 0, bb.Length);   //将数据写入到共享内存中

byte[] bytData = new byte[16];
            int intRet = MemDB.Read(ref bytData, 0, 16);

以上方法是读出内存中的16个字节的内容

以上方法在VS2008中经过测试。

免责声明:文章转载自《C# 共享内存(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ICSharpCode.TextEditor使用及扩展PHP Warning: PHP Startup: redis: Unable to initialize module Windows版本phpredis扩展下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL之对数据库库表的字符集的更改

数据字符集修改步骤: 对于已有的数据库想修改字符集不能直接通过 "alter database character set *"或 "alter table tablename character set *",这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。 已经有记录的字符集的调整,必须先将数据导出,经过修改字符集后重新导入后才可...

[nginx] nginx源码分析--健康检查模块锁分析

健康检查模块 见前文:[nginx] nginx源码分析--健康检查模块 其中有一张框架图, 接下来的内容,将会利用到这个图中的内容。 [classic_tong @ https:////www.cnblogs.com/hugetong/p/12274125.html ]  描述 我们知道nginx是多进程的,每个进程都保存了相同的配置。但是实际上, 并不...

1-嵌入式面试题库

嵌入式工程师:主要从事嵌入式软件开发工作,涉及应用层以及底层软件开发和设计的工作。以应用为中心,计算机技术为基础,软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式产品一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户程序等四个部分构成,用于对其他设备控制、监护、管理。 面试题目(自我介绍/项目/代码量/...

KindEditor 一款好用的HTML可视化编辑器(富文本编辑器)

  KindEditor使用JavaScript编写,可以无缝的于Java、.NET、PHP、ASP等程序接合。 KindEditor非常适合在CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用,2006年7月首次发布2.0以来,KindEditor依靠出色的用户体验和领先的技术不断扩大编辑器市场占有率,目前在国内已经成为最受欢迎的编辑器之一。...

【Mysql】Mysql字符集CHARACTER和COLLATE

一:设置服务器默认字符集为 utf8mb4 创建数据库时,如果没有指定字符集,会采用服务器的默认字符集。设置服务器默认字符集为 utf8mb4 可以提高便利性。 编辑 MySQL 的配置文件,修改服务器默认字符集为utf8mb4。 只需要关心5个系统变量,这5个都改为 utf8mb4 则修改成功: character_set_client characte...

c++与C# winform的消息通讯--(结构体与byte数组的使用)

转载:http://www.cnblogs.com/lizhaoduo/p/3870809.html 近期正在做一个蓝牙驱动的使用程序,其中有一块从c++发送数据到C#的部分,网上查了很多资料,大多都是介绍如何通过调用函数获取用户数据。并且在消息发送中,很少介绍如何发送一个结构体,并且结构体里面有 byte数组(硬件开发常用)等如何进行处理。 首先c++里...