private MemoryMappedViewAccessor _viewAccessor;
/// <summary>
/// 创建或打开共享内存
/// </summary>
/// <param name="memoryName"></param>
/// <param name="capacity"></param>
/// <param name="isOpen"></param>
public void Initializer(string memoryName, long capacity, bool isOpen = true)
{
try
{
MemoryMappedFile memoryMapped = null;
if (isOpen)
memoryMapped = MemoryMappedFile.CreateOrOpen(memoryName, capacity);
else
memoryMapped = MemoryMappedFile.OpenExisting(memoryName);
_viewAccessor = memoryMapped.CreateViewAccessor(0, capacity);
}
catch (Exception ex)
{
throw new Exception($"打开或创建共享内存{memoryName}失败,错误信息为{ex.Message}");
}
}
///读取Ushort数组
public ushort[] GetUshortArrayByMemory(int position, int length)
{
ushort[] size = new ushort[length];
_viewAccessor.ReadArray<ushort>(position, size, 0, size.Length);
return size;
}
///读取byte数组
public byte[] GetByteArrayByMemory(int startPos, int count)
{
byte[] size = new byte[count];
_viewAccessor.ReadArray<byte>(startPos, size, 0, size.Length);
return size;
}
/// <summary>
/// 往共享内存中写入字节数
/// </summary>
/// <param name="bytes"></param>
public void Write(byte[] bytes)
{
try
{
if (_viewAccessor == null)
return;
if (!_viewAccessor.CanWrite)
return;
_viewAccessor.WriteArray<byte>(0, bytes, 0, bytes.Length);
}
catch (Exception ex)
{
LogHelper.WriteLogByType(LogEnum.Error, $"写入失败,异常信息为{ex.Message}");
}
}
/// <summary>
/// 按位置进行写入
/// </summary>
/// <param name="position"></param>
/// <param name="bytes"></param>
public void Write(int position, byte[] bytes)
{
try
{
if (_viewAccessor == null)
return;
if (!_viewAccessor.CanWrite)
return;
char[] chars = Encoding.ASCII.GetChars(bytes);
_viewAccessor.WriteArray<char>(position, chars, 0, chars.Length);
}
catch (Exception ex)
{
LogHelper.WriteLogByType(LogEnum.Error, $"写入失败,异常信息为{ex.Message}");
}
}
备注:上述函数可以修改为泛型;