zoukankan      html  css  js  c++  java
  • 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中经过测试。

  • 相关阅读:
    大数据Hadoop第二周——配置新的节点DataNode及ip地址
    vue环境搭建详细步骤
    苹果电脑Mac系统如何下载安装谷歌Chrome浏览器
    点云的基本特征和描述
    ModuleNotFoundError: No module named 'rospkg'
    ROS的多传感器时间同步机制Time Synchronizer
    Spring Cloud 2020 版本重大变革,更好的命名方式!
    Spring MVC 接收请求参数所有方式总结!
    阿里为什么不用 Zookeeper 做服务发现?
    微服务之间最佳调用方式是什么?
  • 原文地址:https://www.cnblogs.com/dogxuefeng/p/7229691.html
Copyright © 2011-2022 走看看