提交 45d7b693 编写于 作者: cdy816's avatar cdy816

日常更新

上级 b2b0ff90
......@@ -17,11 +17,11 @@ namespace Cdy.Tag
/// <summary>
/// 划分内存
/// </summary>
public unsafe class MemoryBlock:IDisposable
public unsafe class MemoryBlock : IDisposable
{
#region ... Variables ...
///// <summary>
/////
///// </summary>
......@@ -29,8 +29,11 @@ namespace Cdy.Tag
private List<byte[]> mBuffers;
/// <summary>
///
/// </summary>
private List<IntPtr> mHandles;
/// <summary>
///
/// </summary>
......@@ -67,7 +70,7 @@ namespace Cdy.Tag
/// </summary>
/// <param name="size"></param>
/// <param name="blockSize"></param>
public MemoryBlock(long size,int blockSize)
public MemoryBlock(long size, int blockSize)
{
BufferItemSize = blockSize;
Init(size);
......@@ -86,6 +89,11 @@ namespace Cdy.Tag
#region ... Properties ...
/// <summary>
///
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
......@@ -95,6 +103,10 @@ namespace Cdy.Tag
{
return mBuffers;
}
internal set
{
mBuffers = value;
}
}
......@@ -130,7 +142,7 @@ namespace Cdy.Tag
{
get
{
return mBuffers.Count* BufferItemSize;
return mBuffers.Count * BufferItemSize;
}
}
......@@ -163,6 +175,34 @@ namespace Cdy.Tag
}
}
/// <summary>
///
/// </summary>
public long AllocSize
{
get
{
return mAllocSize;
}
}
/// <summary>
///
/// </summary>
internal List<IntPtr> Handles
{
get
{
return mHandles;
}
set
{
mHandles = value;
}
}
#endregion ...Properties...
......@@ -294,6 +334,8 @@ namespace Cdy.Tag
Array.Clear(vv, 0, vv.Length);
mUsedSize = 0;
mPosition = 0;
LoggerService.Service.Info("MemoryBlock", Name + " is clear !");
}
#region ReadAndWrite
......@@ -1439,8 +1481,9 @@ namespace Cdy.Tag
/// <param name="memory"></param>
public static void MakeMemoryBusy(this MemoryBlock memory)
{
LoggerService.Service.Info("MemoryBlock", memory.Name + " is busy.....");
memory.IsBusy = true;
memory.StartMemory[0] = 1;
//memory.StartMemory[0] = 1;
}
/// <summary>
......@@ -1449,9 +1492,46 @@ namespace Cdy.Tag
/// <param name="memory"></param>
public static void MakeMemoryNoBusy(this MemoryBlock memory)
{
LoggerService.Service.Info("MemoryBlock", memory.Name+ " is ready !");
memory.IsBusy = false;
memory.StartMemory[0] = 0;
//memory.StartMemory[0] = 0;
}
}
public static void SaveToFile(this MemoryBlock memory, string fileName)
{
var stream = System.IO.File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
stream.Write(BitConverter.GetBytes(memory.Buffers.Count),0,4);
stream.Write(BitConverter.GetBytes(memory.BufferItemSize), 0, 4);
foreach(var vv in memory.Buffers)
{
stream.Write(vv, 0, vv.Length);
}
stream.Flush();
stream.Close();
}
/// <summary>
///
/// </summary>
/// <param name="memory"></param>
/// <param name="fileName"></param>
public static MemoryBlock LoadFileToMemory(this string fileName)
{
var stream = (System.IO.File.Open(fileName, FileMode.Open, FileAccess.Read));
byte[] bb = new byte[4];
stream.Read(bb, 0, 4);
int mbcount = BitConverter.ToInt32(bb,0);
stream.Read(bb, 0, 4);
int bufferItemSize = BitConverter.ToInt32(bb, 0);
MemoryBlock memory = new MemoryBlock(bufferItemSize * mbcount);
for (int i = 0; i < mbcount; i++)
{
long size = Math.Min(memory.BufferItemSize, stream.Length - stream.Position);
stream.Read(memory.Buffers[i], 0, (int)size);
}
stream.Close();
return memory;
}
}
}
......@@ -67,7 +67,7 @@ namespace Cdy.Tag
/// <param name="msg"></param>
public void Info(string name, string msg)
{
Console.WriteLine(string.Format(infoFormate, DateTime.Now.ToString(), name, msg));
Console.WriteLine(string.Format(infoFormate, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), name, msg));
}
#endregion ...Methods...
......
{
"version": 1,
"dgSpecHash": "GNdw02PdT0/bn3nQZfLtxrHJTThhfM4VUJffsUU91Qtw7EJFKcoYDujiddGQArl4hK1qow6TDEWLLnHQazvVDQ==",
"dgSpecHash": "ptZw5fqc+E+hw+c5okY4wygl5ajInAshIC3syZ7Uh2b5CO8dT1HoXEklk8I343wX8OlBcKMNjnFn703AzrZ/Ng==",
"success": true
}
\ No newline at end of file
......@@ -57,7 +57,7 @@
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
......@@ -235,7 +235,7 @@
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
......@@ -44,7 +44,7 @@ namespace Cdy.Tag
/// 单个数据块保存数据的时长
/// 单位分钟
/// </summary>
public int DataBlockDuration { get; set; } = 10;
public int DataBlockDuration { get; set; } = 1;
/// <summary>
/// 一个文件中变量的个数
......
{
"version": 1,
"dgSpecHash": "EOJIczWwB0MKenCv2sHeyMwKV++hyG+cdOS4BaX0riyXWgspAvE43Rn3U0uqVhmcPgZETzVCJwn+V/3S1rSbsA==",
"dgSpecHash": "zmXE4ilC7tFv7X9Fxgrlqdv1P1IuaybFlzO9p4PSGf/J5/CO4zjaCUk7xZYDr4A3XQ3gJZWvDKzQBETTm7CqPw==",
"success": true
}
\ No newline at end of file
......@@ -57,7 +57,7 @@
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
......@@ -235,7 +235,7 @@
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
......@@ -87,8 +87,8 @@ namespace Cdy.Tag
数据区:[data block]
data block:size+compressType+data
*/
mMemory1 = new MemoryBlock(size);
mMemory2 = new MemoryBlock(size);
mMemory1 = new MemoryBlock(size) { Name = "CompressMemory1" };
mMemory2 = new MemoryBlock(size) { Name = "CompressMemory2" };
}
/// <summary>
......@@ -161,18 +161,31 @@ namespace Cdy.Tag
resetEvent.Reset();
if (mIsClosed)
break;
LoggerService.Service.Info("Compress", "********开始执行压缩********");
var sm = mSourceMemory;
mTargetMemory = SelectMemory();
while (mTargetMemory == null)
{
LoggerService.Service.Info("Comperss", "压缩出现阻塞");
LoggerService.Service.Info("Compress", "压缩出现阻塞");
Thread.Sleep(10);
mTargetMemory = SelectMemory();
}
mTargetMemory.MakeMemoryBusy();
Compress();
mSourceMemory.MakeMemoryNoBusy();
ServiceLocator.Locator.Resolve<IDataSerialize>().RequestToSave(mTargetMemory, mCurrentTime);
sm.Clear();
sm.MakeMemoryNoBusy();
LoggerService.Service.Info("Compress", ">>>>>>>>>压缩完成>>>>>>>>>" + mTargetMemory.UsedSize);
//System.Threading.Tasks.Task.Run(new Action(() => {
// ServiceLocator.Locator.Resolve<IDataSerialize>().RequestToSave(mTargetMemory, mCurrentTime);
//}));
//new System.Threading.Tasks.TaskFactory().StartNew(new Action(() => {
ServiceLocator.Locator.Resolve<IDataSerialize>().RequestToSave(mTargetMemory, mCurrentTime);
//}));
}
closedEvent.Set();
}
......
......@@ -35,7 +35,7 @@ namespace Cdy.Tag
/// 每个变量在内存中保留的历史记录历史的长度
/// 单位s
/// </summary>
public int MemoryCachTime = 60*60;
public int MemoryCachTime = 10*60;
/// <summary>
/// 历史记录时间最短间隔
......@@ -208,6 +208,7 @@ namespace Cdy.Tag
if(!mLastProcesser.AddTag(mHisTag))
{
mLastProcesser = new TimerMemoryCacheProcesser();
mLastProcesser.AddTag(mHisTag);
mRecordTimerProcesser.Add(mLastProcesser);
}
}
......@@ -328,9 +329,10 @@ namespace Cdy.Tag
vv.Value.DataSize = ss;
headSize += ss;
vv.Value.Init();
}
mMemory1 = new MemoryBlock(headSize);
mMemory2 = new MemoryBlock(headSize);
mMemory1 = new MemoryBlock(headSize) { Name = "RecordMemory1" };
mMemory2 = new MemoryBlock(headSize) { Name = "RecordMemory2" };
CurrentMemory = mMemory1;
......@@ -341,7 +343,9 @@ namespace Cdy.Tag
/// </summary>
private void InitMemory()
{
mCurrentMemory.Clear();
LoggerService.Service.Info("Record", "内存初始化开始 ");
//mCurrentMemory.Clear();
//LoggerService.Service.Info("Record", "内存初始化开始 清空完成");
//写入时间
mCurrentMemory.WriteDatetime(1, mLastProcessTime);
//写入变量个数
......@@ -351,6 +355,7 @@ namespace Cdy.Tag
//写入最小时间间隔
mCurrentMemory.WriteInt(17, MemoryTimeTick);
int offset = 21;
//LoggerService.Service.Info("Record", "内存初始化开始 头数据写入完成");
foreach (var vv in mHisTags)
{
mCurrentMemory.WriteInt(offset, vv.Value.Id); //Tag id int(4)
......@@ -359,8 +364,6 @@ namespace Cdy.Tag
offset += 12;
}
HisRunTag.StartTime = mLastProcessTime;
mMemory1.MakeMemoryBusy();
mMemory2.MakeMemoryNoBusy();
}
/// <summary>
......@@ -376,7 +379,13 @@ namespace Cdy.Tag
mRecordTimer.Elapsed += MRecordTimer_Elapsed;
mRecordTimer.Start();
mLastProcessTime = DateTime.Now;
LoggerService.Service.Info("Record", "历史变量个数: "+this.mHisTags.Count);
InitMemory();
mMemory1.MakeMemoryNoBusy();
mMemory2.MakeMemoryNoBusy();
}
/// <summary>
......@@ -387,7 +396,7 @@ namespace Cdy.Tag
{
while (memory.IsBusy)
{
LoggerService.Service.Info("Record", "记录出现阻塞");
LoggerService.Service.Info("Record", "记录出现阻塞 " + memory.Name);
System.Threading.Thread.Sleep(1);
}
}
......@@ -398,26 +407,48 @@ namespace Cdy.Tag
private void SwitchMemory()
{
var mcc = mCurrentMemory;
LoggerService.Service.Info("Record", @"");
LoggerService.Service.Info("Record", ".....开始Memory选择.....");
if (mCurrentMemory == mMemory1)
{
CheckMemoryIsReady(mMemory2);
CurrentMemory = mMemory2;
LoggerService.Service.Info("Record", "选择 Memory2 ");
}
else
{
CheckMemoryIsReady(mMemory1);
CurrentMemory = mMemory1;
LoggerService.Service.Info("Record", "选择 Memory1 ");
}
//提交到数据压缩流程
ServiceLocator.Locator.Resolve<IDataCompress>().RequestToCompress(mcc);
if (mcc != null)
{
mcc.MakeMemoryBusy();
//提交到数据压缩流程
ServiceLocator.Locator.Resolve<IDataCompress>().RequestToCompress(mcc);
InitMemory();
//new System.Threading.Tasks.TaskFactory().StartNew(new Action(() => {
foreach(var vv in mHisTags.Values)
//}));
//System.Threading.Tasks.Task.Run(new Action(() => {
// ServiceLocator.Locator.Resolve<IDataCompress>().RequestToCompress(mcc);
//}));
LoggerService.Service.Info("Record", "提交内存 "+mcc.Name+" 进行压缩");
}
InitMemory();
LoggerService.Service.Info("Record", "内存初始化完成");
foreach (var vv in mHisTags.Values)
{
vv.Reset();
}
LoggerService.Service.Info("Record", ".....结束Memory选择.....");
LoggerService.Service.Info("Record", "");
}
/// <summary>
......@@ -443,41 +474,67 @@ namespace Cdy.Tag
var mm = (dt.Hour * 24 + dt.Minute * 60 + dt.Second) / MemoryCachTime;
if (mm!=mLastProcessTick )
{
if(mLastProcessTick != -1)
LoggerService.Service.Info("Record", "------------------------------------------------------------");
//LoggerService.Service.Info("Record", "开始新的DataRegion");
if (mLastProcessTick != -1)
{
LoggerService.Service.Info("Record", "开始记录尾部数据");
//在内存尾部一次填充所有值
if (mCurrentMemory != null)
{
foreach (var vv in mRecordTimerProcesser)
{
//foreach (var vv in mRecordTimerProcesser)
//{
// vv.RecordAllValue(dt);
//}
System.Threading.Tasks.Parallel.ForEach(mRecordTimerProcesser, (vv) => {
vv.RecordAllValue(dt);
}
});
foreach (var vv in mValueChangedProcesser)
{
System.Threading.Tasks.Parallel.ForEach(mValueChangedProcesser, (vv) => {
vv.RecordAllValue(dt);
}
}
});
//foreach (var vv in mValueChangedProcesser)
//{
// vv.RecordAllValue(dt);
//}
}
LoggerService.Service.Info("Record", "结束记录尾部数据");
mLastProcessTime = dt;
//将之前的Memory提交到历史存储流程中
SwitchMemory();
}
mLastProcessTick = mm;
LoggerService.Service.Info("Record",mCurrentMemory.Name + " 开始工作 ");
//在内存头部一次填充所有值
foreach (var vv in mRecordTimerProcesser)
{
System.Threading.Tasks.Parallel.ForEach(mRecordTimerProcesser, (vv) => {
vv.WriteHeader();
vv.RecordAllValue(dt);
}
});
foreach (var vv in mValueChangedProcesser)
{
//foreach (var vv in mRecordTimerProcesser)
//{
// vv.WriteHeader();
// vv.RecordAllValue(dt);
//}
//foreach (var vv in mValueChangedProcesser)
//{
// vv.WriteHeader();
// vv.RecordAllValue(dt);
//}
System.Threading.Tasks.Parallel.ForEach(mValueChangedProcesser, (vv) => {
vv.WriteHeader();
vv.RecordAllValue(dt);
}
});
//LoggerService.Service.Info("Record", " 完成DataRegion切换 ");
LoggerService.Service.Info("Record", "------------------------------------------------------------");
}
else
{
......
......@@ -3114,14 +3114,16 @@ namespace Cdy.Tag
/// <param name="blockDuration"></param>
/// <param name="timetick"></param>
/// <returns></returns>
public static Dictionary<int, long> CheckBlockHeadCach(this DataFileSeriserbase datafile, long offset, out int fileDuration, out int blockDuration, out int timetick)
public static Dictionary<int, int> CheckBlockHeadCach(this DataFileSeriserbase datafile, long offset,out int tagCount, out int fileDuration, out int blockDuration, out int timetick)
{
//文件头部结构:Pre DataRegion(8) + Next DataRegion(8) + Datatime(8)+tagcount(4)+ tagid sum(8) +file duration(4)+ block duration(4)+Time tick duration(4)+ { + tagid1+tagid2+...+tagidn }+ {tag1 block point1(8) + block size(4) + tag1 block point2(8)+ block size(4) + tag1 block point3(8)+ block size(4)+...+tag1 block pointn(8)+ block size(4) + tag2 block point1 (8)+ block size(4)+ tag2 block point2(8)+ block size(4)+....}
//文件头部结构:Pre DataRegion(8) + Next DataRegion(8) + Datatime(8)+tagcount(4)+ tagid sum(8) +file duration(4)+ block duration(4)+Time tick duration(4)+ { + tagid1+tagid2+...+tagidn }+ {[tag1 block point1(8) + tag2 block point1+ tag3 block point1+...] + [tag1 block point2(8) + tag2 block point2+ tag3 block point2+...]....}
var dataoffset = offset + 24;
//读取变量个数
int count = datafile.ReadInit(dataoffset);
dataoffset += 4;
tagCount = count;
//读取校验和
long idsum = datafile.ReadLong(dataoffset);
dataoffset += 8;
......@@ -3147,7 +3149,8 @@ namespace Cdy.Tag
{
VarintCodeMemory vcm = new VarintCodeMemory(dd.StartMemory);
var ltmp = vcm.ToIntList();
var dtmp = new Dictionary<int, long>();
var dtmp = new Dictionary<int, int>();
if (ltmp.Count > 0)
{
int preid = ltmp[0];
......@@ -3160,6 +3163,7 @@ namespace Cdy.Tag
}
}
TagHeadOffsetManager.manager.Add(idsum, count, dtmp);
return dtmp;
}
}
......@@ -3171,7 +3175,7 @@ namespace Cdy.Tag
}
/// <summary>
/// 读取数据区域的数据头数据
/// 读取某个变量在头部文件种的序号
/// </summary>
/// <param name="datafile"></param>
/// <param name="tid"></param>
......@@ -3180,9 +3184,9 @@ namespace Cdy.Tag
/// <param name="blockDuration"></param>
/// <param name="timetick"></param>
/// <returns></returns>
public static long ReadTargetBlockAddress(this DataFileSeriserbase datafile, int tid, long offset, out int fileDuration, out int blockDuration, out int timetick)
public static int ReadTagIndexInDataPointer(this DataFileSeriserbase datafile, int tid, long offset, out int tagCount,out int fileDuration, out int blockDuration, out int timetick)
{
var hfile = datafile.CheckBlockHeadCach(offset, out fileDuration, out blockDuration, out timetick);
var hfile = datafile.CheckBlockHeadCach(offset,out tagCount ,out fileDuration, out blockDuration, out timetick);
if (hfile.ContainsKey(tid))
{
return hfile[tid];
......@@ -3200,9 +3204,9 @@ namespace Cdy.Tag
/// <param name="blockDuration"></param>
/// <param name="timetick"></param>
/// <returns></returns>
public static List<long> ReadTargetBlockAddress(this DataFileSeriserbase datafile, List<int> tid, long offset, out int fileDuration, out int blockDuration, out int timetick)
public static List<long> ReadTargetBlockAddress(this DataFileSeriserbase datafile, List<int> tid ,long offset,out int tagCount, out int fileDuration, out int blockDuration, out int timetick)
{
var hfile = datafile.CheckBlockHeadCach(offset, out fileDuration, out blockDuration, out timetick);
var hfile = datafile.CheckBlockHeadCach(offset,out tagCount, out fileDuration, out blockDuration, out timetick);
List<long> re = new List<long>();
foreach (var vv in tid)
{
......@@ -3233,7 +3237,8 @@ namespace Cdy.Tag
public static MemoryBlock ReadTagDataBlock(this DataFileSeriserbase datafile, int tid, long offset, DateTime dataTime, out int timetick)
{
int fileDuration, blockDuration = 0;
var blockpointer = datafile.ReadTargetBlockAddress(tid, offset, out fileDuration, out blockDuration, out timetick);
int tagCount = 0;
var blockIndex = datafile.ReadTagIndexInDataPointer(tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick);
int blockcount = fileDuration * 60 / blockDuration;
var startTime = datafile.ReadDateTime(16);
......@@ -3249,10 +3254,11 @@ namespace Cdy.Tag
throw new Exception("DataPointer index is out of total block number");
}
var dataPointer = datafile.ReadLong(blockpointer + dindex * 12);
var datasize = datafile.ReadInit(blockpointer + dindex * 12 + 8);
var dataPointer = datafile.ReadLong(blockIndex * 8 + dindex * tagCount * 8); //读取DataBlock的地址
var datasize = datafile.ReadInit(dataPointer); //读取DataBlock 的大小
return datafile.Read(dataPointer, datasize);
return datafile.Read(dataPointer + 4, datasize);
}
/// <summary>
......@@ -3267,7 +3273,8 @@ namespace Cdy.Tag
public static Dictionary<DateTime, MemoryBlock> ReadTagDataBlock(this DataFileSeriserbase datafile, int tid, long offset, List<DateTime> dataTimes, out int timetick)
{
int fileDuration, blockDuration = 0;
var blockpointer = datafile.ReadTargetBlockAddress(tid, offset, out fileDuration, out blockDuration, out timetick);
int tagCount = 0;
var blockIndex = datafile.ReadTagIndexInDataPointer(tid, offset, out tagCount, out fileDuration, out blockDuration, out timetick);
int blockcount = fileDuration * 60 / blockDuration;
var startTime = datafile.ReadDateTime(16);
......@@ -3290,12 +3297,13 @@ namespace Cdy.Tag
throw new Exception("DataPointer index is out of total block number");
}
var dataPointer = datafile.ReadLong(blockpointer + dindex * 12);
var datasize = datafile.ReadInit(blockpointer + dindex * 12 + 8);
var dataPointer = datafile.ReadLong(blockIndex * 8 + dindex * tagCount * 8); //读取DataBlock的地址
var datasize = datafile.ReadInit(dataPointer); //读取DataBlock 的大小
if (!rtmp.ContainsKey(dataPointer))
{
var rmm = datafile.Read(dataPointer, datasize);
var rmm = datafile.Read(dataPointer + 4, datasize);
re.Add(vdd, rmm);
rtmp.Add(dataPointer, rmm);
}
......@@ -3319,7 +3327,8 @@ namespace Cdy.Tag
public static Dictionary<MemoryBlock, List<DateTime>> ReadTagDataBlock2(this DataFileSeriserbase datafile, int tid, long offset, List<DateTime> dataTimes, out int timetick)
{
int fileDuration, blockDuration = 0;
var blockpointer = datafile.ReadTargetBlockAddress(tid, offset, out fileDuration, out blockDuration, out timetick);
int tagCount = 0;
var blockIndex = datafile.ReadTagIndexInDataPointer(tid, offset,out tagCount, out fileDuration, out blockDuration, out timetick);
int blockcount = fileDuration * 60 / blockDuration;
var startTime = datafile.ReadDateTime(16);
......@@ -3342,8 +3351,9 @@ namespace Cdy.Tag
throw new Exception("DataPointer index is out of total block number");
}
var dataPointer = datafile.ReadLong(blockpointer + dindex * 12);
var datasize = datafile.ReadInit(blockpointer + dindex * 12 + 8);
var dataPointer = datafile.ReadLong(blockIndex * 8 + dindex * tagCount * 8); //读取DataBlock的地址
var datasize = datafile.ReadInit(dataPointer); //读取DataBlock 的大小
if (!rtmp.ContainsKey(dataPointer))
{
......@@ -3387,7 +3397,8 @@ namespace Cdy.Tag
public static Dictionary<MemoryBlock, Tuple<DateTime, DateTime>> ReadTagDataBlock2(this DataFileSeriserbase datafile, int tid, long offset, DateTime start,DateTime end, out int timetick)
{
int fileDuration, blockDuration = 0;
var blockpointer = datafile.ReadTargetBlockAddress(tid, offset, out fileDuration, out blockDuration, out timetick);
int tagCount = 0;
var blockIndex = datafile.ReadTagIndexInDataPointer(tid, offset,out tagCount, out fileDuration, out blockDuration, out timetick);
int blockcount = fileDuration * 60 / blockDuration;
var startTime = datafile.ReadDateTime(16);
......@@ -3416,8 +3427,9 @@ namespace Cdy.Tag
throw new Exception("DataPointer index is out of total block number");
}
var dataPointer = datafile.ReadLong(blockpointer + dindex * 12);
var datasize = datafile.ReadInit(blockpointer + dindex * 12 + 8);
var dataPointer = datafile.ReadLong(blockIndex * 8 + dindex * tagCount * 8); //读取DataBlock的地址
var datasize = datafile.ReadInit(dataPointer); //读取DataBlock 的大小
var rmm = datafile.Read(dataPointer, datasize);
if (!re.ContainsKey(rmm))
......
......@@ -27,7 +27,7 @@ namespace Cdy.Tag
/// <summary>
///
/// </summary>
Dictionary<HeadOffsetKey, Dictionary<int, long>> mHeadOffsets = new Dictionary<HeadOffsetKey, Dictionary<int, long>>();
Dictionary<HeadOffsetKey, Dictionary<int, int>> mHeadOffsets = new Dictionary<HeadOffsetKey, Dictionary<int, int>>();
#endregion ...Variables...
......@@ -63,7 +63,7 @@ namespace Cdy.Tag
/// <param name="sum"></param>
/// <param name="count"></param>
/// <param name="offset"></param>
public void Add(long sum,int count,Dictionary<int, long> offset)
public void Add(long sum,int count,Dictionary<int, int> offset)
{
HeadOffsetKey key = new HeadOffsetKey(count, sum);
mHeadOffsets.Add(key, offset);
......@@ -75,7 +75,7 @@ namespace Cdy.Tag
/// <param name="sum"></param>
/// <param name="count"></param>
/// <returns></returns>
public Dictionary<int,long> Get(long sum,int count)
public Dictionary<int,int> Get(long sum,int count)
{
HeadOffsetKey key = new HeadOffsetKey(count, sum);
return mHeadOffsets[key];
......
......@@ -103,6 +103,7 @@ namespace Cdy.Tag
/// <param name="start"></param>
public abstract void Write(byte value, long start);
/// <summary>
///
/// </summary>
......@@ -118,6 +119,15 @@ namespace Cdy.Tag
/// <param name="start"></param>
public abstract void Write(List<byte[]> source, long start);
/// <summary>
///
/// </summary>
/// <param name="source"></param>
/// <param name="start"></param>
/// <param name="offset"></param>
/// <param name="len"></param>
public abstract void Write(List<byte[]> source, long start,int offset,int len);
/// <summary>
///
/// </summary>
......
......@@ -334,28 +334,48 @@ namespace Cdy.Tag
/// </summary>
/// <param name="source"></param>
/// <param name="start"></param>
public override void Write(List<byte[]> source, long start)
public override void Write(List<byte[]> source, long start, int offset, int len)
{
bool isNeedAllCopy = false;
List<Tuple<int, int, int>> copyIndex = new List<Tuple<int, int, int>>();
int sstart = offset;
int count = 0;
int precount = 0;
int copyed = 0;
for (int i = 0; i < source.Count; i++)
{
if (isNeedAllCopy)
{
mStream.Write(source[i], 0, source[i].Length);
}
else
precount = count;
count = source[i].Length + count;
if (count > sstart)
{
precount = count;
count = source[i].Length + count;
if (count > start)
var ltmp = count - sstart;
if (ltmp > (len - copyed))
{
mStream.Write(source[i], (int)(start - precount), (int)(count - start));
isNeedAllCopy = true;
copyIndex.Add(new Tuple<int, int, int>(i, sstart - precount, len - copyed));
break;
}
else
{
copyIndex.Add(new Tuple<int, int, int>(i, sstart - precount, ltmp));
sstart += ltmp;
copyed += ltmp;
}
}
}
mStream.Position = start;
foreach (var vv in copyIndex)
{
mStream.Write(source[vv.Item1], vv.Item2, vv.Item3);
}
}
public override void Write(List<byte[]> source, long start)
{
mStream.Position = start;
for (int i = 0; i < source.Count; i++)
{
mStream.Write(source[i], 0, source[i].Length);
}
}
......
......@@ -27,6 +27,7 @@ using System.Threading.Tasks;
RegionHead: PreDataRegionPoint(8) + NextDataRegionPoint(8) + Datatime(8)+ tagcount(4)+ tagid sum(8)+file duration(4)+block duration(4)+Time tick duration(4)
DataBlockPoint Area: [ID]+[block Point]
[block point]: [[tag1 point,tag2 point,....][tag1 point,tag2 point,...].....] 以时间单位对变量的数去区指针进行组织
DataBlock Area: [block size + data block]
*/
......@@ -187,6 +188,7 @@ namespace Cdy.Tag
if (mIsClosed)
break;
SaveToFile();
mProcessMemory.Clear();
mProcessMemory.MakeMemoryNoBusy();
}
closedEvent.Set();
......@@ -202,20 +204,25 @@ namespace Cdy.Tag
2. 拷贝数据块
3. 更新数据块指针
*/
LoggerService.Service.Info("SeriseEnginer", "********开始执行存储********");
Dictionary<int, long> memoryAddrs = new Dictionary<int, long>();
var count = mProcessMemory.ReadInt(0);
mCurrentTime = mProcessMemory.ReadDateTime(4);
int offset = 12;
for(int i=0;i<count;i++)
for (int i = 0; i < count; i++)
{
var id = mProcessMemory.ReadInt(offset);
var addr = mProcessMemory.ReadLong(offset + 4);
offset += 12;
var id = mProcessMemory.ReadInt(offset);
var addr = mProcessMemory.ReadLong(offset + 4);
memoryAddrs.Add(id, addr);
offset += 12;
}
Parallel.ForEach(memoryAddrs, (keyval) => {
mSeriseFile[keyval.Key].SaveToFile(mProcessMemory, keyval.Value,mCurrentTime);
});
LoggerService.Service.Info("SeriseEnginer", ">>>>>>>>>完成执行存储>>>>>>>");
}
#endregion ...Methods...
......@@ -264,6 +271,10 @@ namespace Cdy.Tag
private MemoryBlock mHeadMemory;
private MemoryBlock mBlockPointMemory;
private long mBlockPointOffset = 0;
private VarintCodeMemory mTagIdMemoryCach;
//变量ID校验和
......@@ -375,6 +386,7 @@ namespace Cdy.Tag
mPreDataRegion = mCurrentDataRegion;
mBlockPointOffset = mCurrentDataRegion + mBlockPointOffset;
}
......@@ -386,7 +398,7 @@ namespace Cdy.Tag
{
//文件头部结构:Pre DataRegion(8) + Next DataRegion(8) + Datatime(8)+tagcount(4)+ tagid sum(8) +file duration(4)+ block duration(4)+Time tick duration(4)+ { len + [tag id]}+ [data blockpoint(8)]
int blockcount = FileDuration * 60 / BlockDuration;
int len = GetDataRegionHeaderLength() + mTagCount * (blockcount * 4);
int len = GetDataRegionHeaderLength() + mTagCount * (blockcount * 8);
len += mTagIdMemoryCach.Position + 4;
if (mHeadMemory != null)
......@@ -405,6 +417,15 @@ namespace Cdy.Tag
mHeadMemory = new MemoryBlock(len);
}
if(mBlockPointMemory==null)
{
mBlockPointMemory = new MemoryBlock(mTagCount * 8);
}
else
{
mBlockPointMemory.Clear();
}
mHeadMemory.Position = 0;
mHeadMemory.Write((long)mPreDataRegion);//更新Pre DataRegion 指针
mHeadMemory.Write((long)0); //更新Next DataRegion 指针
......@@ -421,6 +442,8 @@ namespace Cdy.Tag
mHeadMemory.Write(mTagIdMemoryCach.Position);//写入压缩后的数组的长度
mHeadMemory.Write(mTagIdMemoryCach.Buffer, 0, mTagIdMemoryCach.Position);//写入压缩数据
mBlockPointOffset = mHeadMemory.Position;
return len;
}
......@@ -432,18 +455,21 @@ namespace Cdy.Tag
#endregion ...Interfaces...
/// <summary>
/// 更新数据块文件指针
/// </summary>
/// <param name="id"></param>
/// <param name="datapointer"></param>
public void UpdateDataBlockPointer(int id, long datapointer, DateTime dateTime)
{
int bindex = ((dateTime.Hour - FileStartHour) * 60 + dateTime.Minute) / BlockDuration;
int icount = id / TagCountOneFile;
long ids = CurrentDataRegion + mIdAddrs[id] + bindex * 8; //当前数据区域地址+数据指针的起始地址+指针偏移
FileWriter.Write(BitConverter.GetBytes(datapointer), ids);
}
///// <summary>
///// 更新数据块文件指针
///// </summary>
///// <param name="id"></param>
///// <param name="datapointer"></param>
//public void UpdateDataBlockPointer(int id, long datapointer,int bid)
//{
// //int bindex = ((dateTime.Hour - FileStartHour) * 60 + dateTime.Minute) / BlockDuration;
// int icount = id / TagCountOneFile;
// // long ids = CurrentDataRegion + mIdAddrs[id] + bid * 8; //当前数据区域地址+数据指针的起始地址+指针偏移
// mBlockPointMemory.WriteLong(mIdAddrs[id] + bid * 8, datapointer);
// // FileWriter.Write(BitConverter.GetBytes(datapointer), ids);
//}
/// <summary>
///
......@@ -537,15 +563,19 @@ namespace Cdy.Tag
public void Init()
{
mIdAddrs.Clear();
long offset = GetDataRegionHeaderLength() + CalTagIdsSize();
//long offset = GetDataRegionHeaderLength() + CalTagIdsSize();
long offset = 0;
int blockcount = FileDuration * 60 / BlockDuration;
var vv = ServiceLocator.Locator.Resolve<ITagQuery>();
var tags = vv.ListAllTags().Where(e => e.Id >= Id * TagCountOneFile && e.Id < (Id + 1) * TagCountOneFile).OrderBy(e => e.Id);
foreach (var vtag in tags)
{
mIdAddrs.Add(vtag.Id, offset);
offset += (blockcount * 8);
//offset += (blockcount * 8);
offset += 8;
}
CalTagIdsSize();
}
/// <summary>
......@@ -575,7 +605,7 @@ namespace Cdy.Tag
}
else
{
if (mFileWriter.Length < 8)
if (mFileWriter.Length < 72)
{
AppendFileHeader(time, this.DatabaseName);
//新建文件
......@@ -618,6 +648,8 @@ namespace Cdy.Tag
3. 更新数据块指针
*/
LoggerService.Service.Info("SeriseFileItem"+Id, "*********开始执行存储**********");
var totalsize = mProcessMemory.ReadInt(dataOffset);
var count = mProcessMemory.ReadInt(dataOffset + 4);
mTagCount = count;
......@@ -638,13 +670,17 @@ namespace Cdy.Tag
if (!CheckFile(time))
return;
offset = 8;
offset = 8 + dataOffset;
long start = count * 8 + offset;//计算出数据起始地址
LoggerService.Service.Info("SeriseFileItem" + Id, "写入数据 "+ (totalsize - start)/1024.0/1024 +" m");
this.mFileWriter.Append(mProcessMemory.Buffers, (int)start, (int)(totalsize - start)); //直接拷贝数据块
var pos = mFileWriter.CurrentPostion;
LoggerService.Service.Info("SeriseFileItem" + Id, "开始更新指针区域");
FileStartHour = (time.Hour / FileDuration)*FileDuration;
FileStartHour = time.Hour / FileDuration;
int bid = ((time.Hour - FileStartHour) * 60 + time.Minute) / BlockDuration;
for (int i = 0; i < count; i++)
{
......@@ -652,12 +688,23 @@ namespace Cdy.Tag
offset += 4;
var addr = mProcessMemory.ReadInt(offset) + mCurrentDataRegion;
offset += 4;
UpdateDataBlockPointer(id, addr, time);
mBlockPointMemory.WriteLong(mIdAddrs[id], addr);
}
mCurrentDataRegion = pos;
var pointAddr = mBlockPointOffset + count * 8 * bid;
LoggerService.Service.Info("SeriseFileItem" + Id, "开始写入指针区域到文件 offset:"+ pointAddr + " Size:"+ mBlockPointMemory.AllocSize/1024.0/1024+" m");
mFileWriter.Write(mBlockPointMemory.Buffers, pointAddr, 0, (int)mBlockPointMemory.AllocSize);
LoggerService.Service.Info("SeriseFileItem" + Id, "更新指针区域完成");
Flush();
LoggerService.Service.Info("SeriseEnginer" + Id, ">>>>>>>>>完成执行存储>>>>>>>>>");
}
/// <summary>
......
......@@ -20,6 +20,8 @@ namespace Cdy.Tag
#region ... Variables ...
private byte[] headBytes;
#endregion ...Variables...
#region ... Events ...
......@@ -97,6 +99,19 @@ namespace Cdy.Tag
#region ... Methods ...
public void Init()
{
var hbyts = new List<byte>(19);
hbyts.AddRange(BitConverter.GetBytes(this.HisQulityStartAddr - this.TimerValueStartAddr));
hbyts.Add((byte)this.Type);
hbyts.Add((byte)this.TagType);
hbyts.Add((byte)this.CompressType);
hbyts.AddRange(BitConverter.GetBytes(CompressParameter1));
hbyts.AddRange(BitConverter.GetBytes(CompressParameter2));
hbyts.AddRange(BitConverter.GetBytes(CompressParameter3));
headBytes = hbyts.ToArray();
}
/// <summary>
///
/// </summary>
......@@ -122,21 +137,24 @@ namespace Cdy.Tag
{
//数据块头部结构
//数据区大小(int)+记录类型(byte)+变量类型(byte)+压缩类型(byte)+压缩参数1(float)+压缩参数2(float)+压缩参数3(float)
//var bids = BitConverter.GetBytes(this.HisQulityStartAddr - this.HisValueStartAddr);
//Buffer.BlockCopy(HisAddr, BlockHeadStartAddr, bids, 0, bids.Length);
HisAddr.WriteInt(BlockHeadStartAddr, this.HisQulityStartAddr - this.TimerValueStartAddr);
//写入记录类型
HisAddr.WriteByte(BlockHeadStartAddr+4, (byte)this.Type);
//写入变量类型
HisAddr.WriteByte(BlockHeadStartAddr+5, (byte)this.TagType);
//写入压缩类型
HisAddr.WriteByte(BlockHeadStartAddr+6, (byte)this.CompressType);
//写入压缩附属参数
HisAddr.WriteFloat(BlockHeadStartAddr + 7, CompressParameter1);
HisAddr.WriteFloat(BlockHeadStartAddr + 11, CompressParameter2);
HisAddr.WriteFloat(BlockHeadStartAddr + 15, CompressParameter3);
HisAddr.WriteBytes(BlockHeadStartAddr, headBytes);
//HisAddr.WriteInt(BlockHeadStartAddr, this.HisQulityStartAddr - this.TimerValueStartAddr);
////写入记录类型
//HisAddr.WriteByte(BlockHeadStartAddr+4, (byte)this.Type);
////写入变量类型
//HisAddr.WriteByte(BlockHeadStartAddr+5, (byte)this.TagType);
////写入压缩类型
//HisAddr.WriteByte(BlockHeadStartAddr+6, (byte)this.CompressType);
////写入压缩附属参数
//HisAddr.WriteFloat(BlockHeadStartAddr + 7, CompressParameter1);
//HisAddr.WriteFloat(BlockHeadStartAddr + 11, CompressParameter2);
//HisAddr.WriteFloat(BlockHeadStartAddr + 15, CompressParameter3);
}
/// <summary>
......
......@@ -57,6 +57,15 @@ namespace Cdy.Tag
#region ... Constructor...
/// <summary>
///
/// </summary>
static Runner()
{
//注册日志
ServiceLocator.Locator.Registor<ILog>(new ConsoleLogger());
}
#endregion ...Constructor...
#region ... Properties ...
......@@ -133,12 +142,12 @@ namespace Cdy.Tag
InitPath();
mHisFileManager = new DataFileManager(mDatabaseName);
LoadHisDatabase();
mHisFileManager.TagCountOneFile = mHisDatabase.Setting.TagCountOneFile;
var task = mHisFileManager.Int();
LoadRealDatabase();
LoadHisDatabase();
realEnginer = new RealEnginer(mDatabase);
realEnginer.Init();
......@@ -169,8 +178,7 @@ namespace Cdy.Tag
/// </summary>
private void RegistorInterface()
{
//注册日志
ServiceLocator.Locator.Registor<ILog>(new ConsoleLogger());
ServiceLocator.Locator.Registor<IRealData>(realEnginer);
ServiceLocator.Locator.Registor<IRealDataNotify>(realEnginer);
......@@ -207,11 +215,13 @@ namespace Cdy.Tag
/// <param name="database"></param>
public async void StartAsync(string database)
{
LoggerService.Service.Info("Runner", database+"开始启动");
await InitAsync(database);
seriseEnginer.Start();
compressEnginer.Start();
hisEnginer.Start();
mIsStarted = true;
LoggerService.Service.Info("Runner", database + "启动完成");
}
......
{
"version": 1,
"dgSpecHash": "sieRLC+b0OUVtVeWYf7847K6mKRQhPXydBnCLIK1sgPlJWJhQKaR/pbm2srXfZfVF0u77WbtApAcuxsUufp/VQ==",
"dgSpecHash": "DUNETSwgKhTz0klihUqG5gR+EZ0YdrWA4JanZr8d1G6xjmJeWePZoKI25AlRMhZnj5kbbtC2jVzi/eUp8jcgLg==",
"success": true
}
\ No newline at end of file
......@@ -57,7 +57,7 @@
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
},
......@@ -114,7 +114,7 @@
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
},
......@@ -175,7 +175,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
......@@ -102,7 +102,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
{
"version": 1,
"dgSpecHash": "MgIR1pYmDoUXsbFT2AHPUkZq1BTq/rDkzKxZZF0hfJvX5A9gT+gig2Eh0YEZAPImEcH+7VIb+69Ckb918M0AXQ==",
"dgSpecHash": "wWhlHzalLBkFjfrBe3IkqijCYRVsPdS9x3DiI3ggVozvRvDxHVYbl5KO9U/hVoQvdFvGxgHWiWMHGQJ7p6UCug==",
"success": true
}
\ No newline at end of file
......@@ -73,7 +73,7 @@
"privateAssets": "none"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
......@@ -612,7 +612,7 @@
"privateAssets": "none"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
......@@ -13,15 +13,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataRunner", "..\DataRunner
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cdy.Tag.Common", "..\Cdy.Tag.Common\Cdy.Tag.Common.csproj", "{34F10592-77BF-47D5-B282-3E5856338F97}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cdy.Tag.CoreAPI", "..\Cdy.Tag.CoreAPI\Cdy.Tag.CoreAPI.csproj", "{7E13DDBF-015C-464E-A09F-C5F87FA8143A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cdy.Tag.CommonTests", "..\Cdy.Tag.CommonTests\Cdy.Tag.CommonTests.csproj", "{15DC4D19-A2D0-4624-B83E-12E6466F148C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{1A69E6A7-33B3-4DAF-9D9D-FD7CD474FFD3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataRunnerTests", "..\DataRunnerTests\DataRunnerTests.csproj", "{DF77A949-1A7A-4526-825D-5BF5CC5162E9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DBDevelopService", "..\DBDevelopService\DBDevelopService.csproj", "{2925BF23-5C16-42C3-97A0-9E0427F41D8F}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DBDevelopService", "..\DBDevelopService\DBDevelopService.csproj", "{2925BF23-5C16-42C3-97A0-9E0427F41D8F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
......@@ -49,10 +47,6 @@ Global
{34F10592-77BF-47D5-B282-3E5856338F97}.Debug|Any CPU.Build.0 = Debug|Any CPU
{34F10592-77BF-47D5-B282-3E5856338F97}.Release|Any CPU.ActiveCfg = Release|Any CPU
{34F10592-77BF-47D5-B282-3E5856338F97}.Release|Any CPU.Build.0 = Release|Any CPU
{7E13DDBF-015C-464E-A09F-C5F87FA8143A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7E13DDBF-015C-464E-A09F-C5F87FA8143A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7E13DDBF-015C-464E-A09F-C5F87FA8143A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E13DDBF-015C-464E-A09F-C5F87FA8143A}.Release|Any CPU.Build.0 = Release|Any CPU
{15DC4D19-A2D0-4624-B83E-12E6466F148C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{15DC4D19-A2D0-4624-B83E-12E6466F148C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{15DC4D19-A2D0-4624-B83E-12E6466F148C}.Release|Any CPU.ActiveCfg = Release|Any CPU
......
......@@ -24,6 +24,8 @@ namespace Mars
Console.Write(">");
string[] cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
if (cmd.Length == 0) continue;
string scmd = cmd[0].ToLower();
switch (scmd)
{
......
{
"version": 1,
"dgSpecHash": "aaCHivvAbKHyP03fwtf8Xhsm5ys9JWQHQkoROCV5zBzGtRPBkpbht1B49jp1+OJkTUJDT+OUi1qtsKkgHkWmfA==",
"dgSpecHash": "Gk42zNpgwZyhJ9BJLUpShp6B/L39JgtJE8RyuyoON1O4IIrkLVn8iVXiLfE95IRXcVDAKuroz3OHfd7x+IXhHw==",
"success": true
}
\ No newline at end of file
......@@ -57,7 +57,7 @@
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
},
......@@ -114,7 +114,7 @@
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
},
......@@ -175,7 +175,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
},
......@@ -238,7 +238,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
},
......@@ -302,7 +302,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
......@@ -761,7 +761,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.101\\RuntimeIdentifierGraph.json"
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册