From 4e60cd8649c3c19582ae560515cad00436587a2e Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 13 三月 2026 13:36:35 +0800
Subject: [PATCH] fix: improve MemoryStore code quality and error handling

---
 Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs |  264 +++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 199 insertions(+), 65 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs
index a1b992e..9583b42 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryStore.cs
@@ -72,13 +72,21 @@
         /// <summary>
         /// 璇诲彇瀛楄妭鏁版嵁
         /// </summary>
+        /// <param name="address">鍦板潃锛堝 "M100", "DB1.DBD0", "I0.0", "T1"锛�</param>
+        /// <param name="length">闀垮害锛堝繀椤诲ぇ浜�0锛�</param>
+        /// <returns>瀛楄妭鏁扮粍</returns>
+        /// <exception cref="ArgumentException">鍦板潃涓虹┖鎴栫┖鐧斤紝鎴栭暱搴︿负0</exception>
+        /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
         public byte[] ReadBytes(string address, ushort length)
         {
             if (_disposed)
                 throw new ObjectDisposedException(nameof(MemoryStore));
 
-            if (string.IsNullOrEmpty(address))
-                throw new ArgumentException("鍦板潃涓嶈兘涓虹┖", nameof(address));
+            if (string.IsNullOrWhiteSpace(address))
+                throw new ArgumentException("鍦板潃涓嶈兘涓虹┖鎴栫┖鐧�", nameof(address));
+
+            if (length == 0)
+                throw new ArgumentException("闀垮害蹇呴』澶т簬0", nameof(length));
 
             var (regionType, offset, dbNumber, bitOffset) = ParseAddress(address);
 
@@ -96,14 +104,21 @@
 
         /// <summary>
         /// 璇诲彇鎸囧畾绫诲瀷鏁版嵁
+        /// 鏀寔鐨勭被鍨嬶細bool, short, int, ushort, float
+        /// 娉ㄦ剰锛歴tring绫诲瀷涓嶅彈鏀寔锛岃浣跨敤WriteBytes/ReadBytes鎴栭�氳繃DBRegion鐩存帴璁块棶
         /// </summary>
+        /// <typeparam name="T">鍊肩被鍨嬶紙bool, short, int, ushort, float锛�</typeparam>
+        /// <param name="address">鍦板潃</param>
+        /// <returns>鏁版嵁鍊�</returns>
+        /// <exception cref="ArgumentException">鍦板潃涓虹┖鎴栫┖鐧斤紝鎴栫被鍨嬩笉鏀寔</exception>
+        /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
         public T Read<T>(string address) where T : struct
         {
             if (_disposed)
                 throw new ObjectDisposedException(nameof(MemoryStore));
 
-            if (string.IsNullOrEmpty(address))
-                throw new ArgumentException("鍦板潃涓嶈兘涓虹┖", nameof(address));
+            if (string.IsNullOrWhiteSpace(address))
+                throw new ArgumentException("鍦板潃涓嶈兘涓虹┖鎴栫┖鐧�", nameof(address));
 
             var (regionType, offset, dbNumber, bitOffset) = ParseAddress(address);
 
@@ -122,13 +137,18 @@
         /// <summary>
         /// 鍐欏叆瀛楄妭鏁版嵁
         /// </summary>
+        /// <param name="address">鍦板潃</param>
+        /// <param name="data">鏁版嵁</param>
+        /// <exception cref="ArgumentException">鍦板潃涓虹┖鎴栫┖鐧�</exception>
+        /// <exception cref="ArgumentNullException">鏁版嵁涓簄ull</exception>
+        /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
         public void WriteBytes(string address, byte[] data)
         {
             if (_disposed)
                 throw new ObjectDisposedException(nameof(MemoryStore));
 
-            if (string.IsNullOrEmpty(address))
-                throw new ArgumentException("鍦板潃涓嶈兘涓虹┖", nameof(address));
+            if (string.IsNullOrWhiteSpace(address))
+                throw new ArgumentException("鍦板潃涓嶈兘涓虹┖鎴栫┖鐧�", nameof(address));
 
             if (data == null)
                 throw new ArgumentNullException(nameof(data));
@@ -160,14 +180,21 @@
 
         /// <summary>
         /// 鍐欏叆鎸囧畾绫诲瀷鏁版嵁
+        /// 鏀寔鐨勭被鍨嬶細bool, short, int, ushort, float
+        /// 娉ㄦ剰锛歴tring绫诲瀷涓嶅彈鏀寔锛岃浣跨敤WriteBytes/ReadBytes鎴栭�氳繃DBRegion鐩存帴璁块棶
         /// </summary>
+        /// <typeparam name="T">鍊肩被鍨嬶紙bool, short, int, ushort, float锛�</typeparam>
+        /// <param name="address">鍦板潃</param>
+        /// <param name="value">鏁版嵁鍊�</param>
+        /// <exception cref="ArgumentException">鍦板潃涓虹┖鎴栫┖鐧斤紝鎴栫被鍨嬩笉鏀寔</exception>
+        /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
         public void Write<T>(string address, T value) where T : struct
         {
             if (_disposed)
                 throw new ObjectDisposedException(nameof(MemoryStore));
 
-            if (string.IsNullOrEmpty(address))
-                throw new ArgumentException("鍦板潃涓嶈兘涓虹┖", nameof(address));
+            if (string.IsNullOrWhiteSpace(address))
+                throw new ArgumentException("鍦板潃涓嶈兘涓虹┖鎴栫┖鐧�", nameof(address));
 
             var (regionType, offset, dbNumber, bitOffset) = ParseAddress(address);
 
@@ -198,7 +225,13 @@
 
         /// <summary>
         /// 鑾峰彇鍐呭瓨鍖哄煙
+        /// 璀﹀憡锛氳繑鍥炵殑鍖哄煙鏄彲鍙樼殑鐩存帴寮曠敤锛岃皟鐢ㄨ�呰礋璐g敓鍛藉懆鏈熷崗璋冦��
+        /// 姝ゆ柟娉曚富瑕佺敤浜庨珮绾у満鏅拰鍐呴儴浣跨敤銆備竴鑸儏鍐典笅搴斾娇鐢≧ead/Write鏂规硶銆�
         /// </summary>
+        /// <param name="regionType">鍖哄煙绫诲瀷锛圡/DB/I/Q/T/C锛�</param>
+        /// <returns>鍐呭瓨鍖哄煙鎺ュ彛</returns>
+        /// <exception cref="ArgumentException">鍖哄煙绫诲瀷涓嶆敮鎸�</exception>
+        /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
         public IMemoryRegion GetRegion(string regionType)
         {
             if (_disposed)
@@ -219,6 +252,7 @@
         /// <summary>
         /// 娓呯┖鎵�鏈夊唴瀛�
         /// </summary>
+        /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
         public void Clear()
         {
             if (_disposed)
@@ -234,7 +268,11 @@
 
         /// <summary>
         /// 瀵煎嚭鍐呭瓨鏁版嵁
+        /// 璀﹀憡锛氳繖鏄竴涓槀璐电殑鎿嶄綔锛屼細鍒嗛厤澶ч噺鍐呭瓨骞跺鍒舵墍鏈夊尯鍩熸暟鎹��
+        /// 寤鸿浠呭湪闇�瑕佹寔涔呭寲鎴栬皟璇曟椂浣跨敤銆�
         /// </summary>
+        /// <returns>鍖哄煙绫诲瀷 -> 瀛楄妭鏁扮粍鐨勫瓧鍏�</returns>
+        /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
         public Dictionary<string, byte[]> Export()
         {
             if (_disposed)
@@ -253,7 +291,13 @@
 
         /// <summary>
         /// 瀵煎叆鍐呭瓨鏁版嵁
+        /// 浼氶獙璇佹暟鎹暱搴︽槸鍚﹀尮閰嶅尯鍩熷ぇ灏忥紝涓嶅尮閰嶆椂浼氭姏鍑哄紓甯搞��
+        /// DB鍖烘敮鎸佽嚜鍔ㄥ垱寤哄潡锛堝鏋滃啓鍏ユ椂鍧椾笉瀛樺湪锛夈��
         /// </summary>
+        /// <param name="data">鍖哄煙绫诲瀷 -> 瀛楄妭鏁扮粍鐨勫瓧鍏�</param>
+        /// <exception cref="ArgumentNullException">鏁版嵁涓簄ull</exception>
+        /// <exception cref="ArgumentException">鏁版嵁闀垮害涓嶅尮閰�</exception>
+        /// <exception cref="ObjectDisposedException">瀵硅薄宸查噴鏀�</exception>
         public void Import(Dictionary<string, byte[]> data)
         {
             if (_disposed)
@@ -263,76 +307,115 @@
                 throw new ArgumentNullException(nameof(data));
 
             if (data.ContainsKey("M"))
+            {
+                if (data["M"].Length != _config.MRegionSize)
+                    throw new ArgumentException($"M鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏_config.MRegionSize}锛屽疄闄厈data["M"].Length}");
                 _mRegion.Write(0, data["M"]);
+            }
+
             if (data.ContainsKey("DB"))
+            {
                 ImportDBRegion(data["DB"]);
+            }
+
             if (data.ContainsKey("I"))
+            {
+                if (data["I"].Length != _config.IRegionSize)
+                    throw new ArgumentException($"I鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏_config.IRegionSize}锛屽疄闄厈data["I"].Length}");
                 _iRegion.Write(0, data["I"]);
+            }
+
             if (data.ContainsKey("Q"))
+            {
+                if (data["Q"].Length != _config.QRegionSize)
+                    throw new ArgumentException($"Q鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏_config.QRegionSize}锛屽疄闄厈data["Q"].Length}");
                 _qRegion.Write(0, data["Q"]);
+            }
+
             if (data.ContainsKey("T"))
+            {
+                var expectedTSize = _config.TRegionCount * 2; // 姣忎釜瀹氭椂鍣�2瀛楄妭
+                if (data["T"].Length != expectedTSize)
+                    throw new ArgumentException($"T鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏expectedTSize}锛屽疄闄厈data["T"].Length}");
                 _tRegion.Write(0, data["T"]);
+            }
+
             if (data.ContainsKey("C"))
+            {
+                var expectedCSize = _config.CRegionCount * 2; // 姣忎釜璁℃暟鍣�2瀛楄妭
+                if (data["C"].Length != expectedCSize)
+                    throw new ArgumentException($"C鍖烘暟鎹暱搴︿笉鍖归厤锛氭湡鏈泏expectedCSize}锛屽疄闄厈data["C"].Length}");
                 _cRegion.Write(0, data["C"]);
+            }
         }
 
         /// <summary>
         /// 瑙f瀽S7鍦板潃鏍煎紡
         /// 鏀寔鏍煎紡: M100, DB1.DBD0, I0.0, Q0.0, T1, C1
         /// </summary>
+        /// <param name="address">鍦板潃瀛楃涓�</param>
+        /// <returns>瑙f瀽缁撴灉锛氬尯鍩熺被鍨嬨�佸亸绉婚噺銆丏B缂栧彿锛堝彲閫夛級銆佷綅鍋忕Щ锛堝彲閫夛級</returns>
+        /// <exception cref="FormatException">鍦板潃鏍煎紡鏃犳晥鏃舵姏鍑猴紝鍖呭惈璇︾粏鐨勪笂涓嬫枃淇℃伅</exception>
         private (string regionType, ushort offset, ushort? dbNumber, byte? bitOffset) ParseAddress(string address)
         {
             address = address.Trim().ToUpper();
 
-            // DB鍧楀湴鍧�: DB1.DBD0, DB1.DBW10, DB1.DBB20
-            if (address.StartsWith("DB"))
+            try
             {
-                var parts = address.Split(new[] { '.' }, 2);
-                var dbPart = parts[0]; // DB1
-                var offsetPart = parts.Length > 1 ? parts[1] : null; // DBD0, DBW10, etc.
-
-                var dbNumber = ushort.Parse(dbPart.Substring(2));
-                ushort offset = 0;
-
-                if (offsetPart != null)
+                // DB鍧楀湴鍧�: DB1.DBD0, DB1.DBW10, DB1.DBB20
+                if (address.StartsWith("DB"))
                 {
-                    // 瑙f瀽鍋忕Щ绫诲瀷: DBD(4瀛楄妭), DBW(2瀛楄妭), DBB(1瀛楄妭)
-                    if (offsetPart.StartsWith("DBD"))
-                        offset = ushort.Parse(offsetPart.Substring(3));
-                    else if (offsetPart.StartsWith("DBW"))
-                        offset = ushort.Parse(offsetPart.Substring(3));
-                    else if (offsetPart.StartsWith("DBB"))
-                        offset = ushort.Parse(offsetPart.Substring(3));
-                    else
-                        offset = ushort.Parse(offsetPart);
+                    var parts = address.Split(new[] { '.' }, 2);
+                    var dbPart = parts[0]; // DB1
+                    var offsetPart = parts.Length > 1 ? parts[1] : null; // DBD0, DBW10, etc.
+
+                    var dbNumber = ushort.Parse(dbPart.Substring(2));
+                    ushort offset = 0;
+
+                    if (offsetPart != null)
+                    {
+                        // 瑙f瀽鍋忕Щ绫诲瀷: DBD(4瀛楄妭), DBW(2瀛楄妭), DBB(1瀛楄妭)
+                        if (offsetPart.StartsWith("DBD"))
+                            offset = ushort.Parse(offsetPart.Substring(3));
+                        else if (offsetPart.StartsWith("DBW"))
+                            offset = ushort.Parse(offsetPart.Substring(3));
+                        else if (offsetPart.StartsWith("DBB"))
+                            offset = ushort.Parse(offsetPart.Substring(3));
+                        else
+                            offset = ushort.Parse(offsetPart);
+                    }
+
+                    return ("DB", offset, dbNumber, null);
                 }
 
-                return ("DB", offset, dbNumber, null);
-            }
+                // 甯︿綅鍦板潃: I0.0, Q0.0, M0.0
+                if (address.Contains("."))
+                {
+                    var parts = address.Split('.');
+                    var regionType = new string(parts[0].TakeWhile(char.IsLetter).ToArray());
+                    var byteOffset = ushort.Parse(new string(parts[0].SkipWhile(char.IsLetter).ToArray()));
+                    var bitOffset = byte.Parse(parts[1]);
 
-            // 甯︿綅鍦板潃: I0.0, Q0.0, M0.0
-            if (address.Contains("."))
+                    return (regionType, byteOffset, null, (byte?)bitOffset);
+                }
+
+                // 瀹氭椂鍣�/璁℃暟鍣�: T1, C1
+                if (address.StartsWith("T") || address.StartsWith("C"))
+                {
+                    var regionType = address[0].ToString();
+                    var number = ushort.Parse(address.Substring(1));
+                    return (regionType, number, null, null);
+                }
+
+                // 鏅�氬湴鍧�: M100, I100, Q100
+                var region = new string(address.TakeWhile(char.IsLetter).ToArray());
+                var addr = ushort.Parse(new string(address.SkipWhile(char.IsLetter).ToArray()));
+                return (region, addr, null, null);
+            }
+            catch (Exception ex) when (ex is FormatException || ex is OverflowException)
             {
-                var parts = address.Split('.');
-                var regionType = new string(parts[0].TakeWhile(char.IsLetter).ToArray());
-                var byteOffset = ushort.Parse(new string(parts[0].SkipWhile(char.IsLetter).ToArray()));
-                var bitOffset = byte.Parse(parts[1]);
-
-                return (regionType, byteOffset, null, (byte?)bitOffset);
+                throw new FormatException($"鍦板潃鏍煎紡鏃犳晥: '{address}'銆倇ex.Message}", ex);
             }
-
-            // 瀹氭椂鍣�/璁℃暟鍣�: T1, C1
-            if (address.StartsWith("T") || address.StartsWith("C"))
-            {
-                var regionType = address[0].ToString();
-                var number = ushort.Parse(address.Substring(1));
-                return (regionType, number, null, null);
-            }
-
-            // 鏅�氬湴鍧�: M100, I100, Q100
-            var region = new string(address.TakeWhile(char.IsLetter).ToArray());
-            var addr = ushort.Parse(new string(address.SkipWhile(char.IsLetter).ToArray()));
-            return (region, addr, null, null);
         }
 
         /// <summary>
@@ -344,13 +427,15 @@
             var data = _mRegion.Read(offset, (ushort)size);
 
             if (typeof(T) == typeof(bool))
-                return default; // M鍖轰笉鏀寔bool璇诲彇锛屽簲璇ョ敤Mx.x鏍煎紡
+                throw new NotSupportedException("M鍖轰笉鏀寔bool璇诲彇锛屽簲璇ヤ娇鐢∕x.x鏍煎紡锛堜綅鍦板潃锛�");
 
             return ConvertFromBytes<T>(data);
         }
 
         /// <summary>
         /// 璇诲彇DB鍖烘暟鎹�
+        /// 娉ㄦ剰锛歴tring绫诲瀷涓嶅彈姝ゆ硾鍨嬫柟娉曟敮鎸侊紙鍙梬here T : struct绾︽潫锛�
+        /// 璇蜂娇鐢╓riteBytes/ReadBytes鎴栭�氳繃DBRegion鐩存帴璁块棶瀛楃涓�
         /// </summary>
         private T ReadDBRegion<T>(ushort dbNumber, ushort offset) where T : struct
         {
@@ -360,7 +445,8 @@
                 "Int16" => (T)(object)_dbRegion.ReadInt(dbNumber, offset),
                 "Int32" => (T)(object)_dbRegion.ReadDInt(dbNumber, offset),
                 "Single" => (T)(object)_dbRegion.ReadReal(dbNumber, offset),
-                "String" => (T)(object)_dbRegion.ReadString(dbNumber, offset, 254),
+                // String绫诲瀷鍦ㄦ硾鍨嬬害鏉熶笅涓嶅彲杈撅紝浣嗕繚鐣欐敞閲婅鏄�
+                // "String" => (T)(object)_dbRegion.ReadString(dbNumber, offset, 254),
                 _ => ConvertFromBytes<T>(_dbRegion.Read(dbNumber, offset, (ushort)System.Runtime.InteropServices.Marshal.SizeOf<T>()))
             };
         }
@@ -418,6 +504,8 @@
 
         /// <summary>
         /// 鍐欏叆DB鍖烘暟鎹�
+        /// 娉ㄦ剰锛歴tring绫诲瀷涓嶅彈姝ゆ硾鍨嬫柟娉曟敮鎸侊紙鍙梬here T : struct绾︽潫锛�
+        /// 璇蜂娇鐢╓riteBytes/ReadBytes鎴栭�氳繃DBRegion鐩存帴璁块棶瀛楃涓�
         /// </summary>
         private void WriteDBRegion<T>(ushort dbNumber, ushort offset, T value) where T : struct
         {
@@ -435,9 +523,10 @@
                 case "Single":
                     _dbRegion.WriteReal(dbNumber, offset, (float)(object)value);
                     break;
-                case "String":
-                    _dbRegion.WriteString(dbNumber, offset, (string)(object)value, 254);
-                    break;
+                // String绫诲瀷鍦ㄦ硾鍨嬬害鏉熶笅涓嶅彲杈撅紝浣嗕繚鐣欐敞閲婅鏄�
+                // case "String":
+                //     _dbRegion.WriteString(dbNumber, offset, (string)(object)value, 254);
+                //     break;
                 default:
                     var data = ConvertToBytes(value);
                     _dbRegion.Write(dbNumber, offset, data);
@@ -493,7 +582,9 @@
 
         /// <summary>
         /// 浠庡瓧鑺傛暟缁勮浆鎹负鍊肩被鍨�
+        /// 浣跨敤澶х瀛楄妭搴忥紙Big-Endian锛夛紝涓嶴7 PLC瑙勮寖涓�鑷�
         /// </summary>
+        /// <exception cref="NotSupportedException">绫诲瀷涓嶆敮鎸佹椂鎶涘嚭</exception>
         private T ConvertFromBytes<T>(byte[] data) where T : struct
         {
             if (typeof(T) == typeof(short))
@@ -505,15 +596,31 @@
             if (typeof(T) == typeof(ushort))
                 return (T)(object)((ushort)((data[0] << 8) | data[1]));
 
-            if (typeof(T) == typeof(float))
-                return (T)(object)BitConverter.ToSingle(data, 0);
+            if (typeof(T) == typeof(uint))
+                return (T)(object)((uint)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]));
 
-            return default;
+            if (typeof(T) == typeof(float))
+            {
+                // BitConverter榛樿浣跨敤绯荤粺瀛楄妭搴忥紝闇�瑕佽浆鎹负澶х
+                if (BitConverter.IsLittleEndian)
+                    Array.Reverse(data);
+                return (T)(object)BitConverter.ToSingle(data, 0);
+            }
+
+            if (typeof(T) == typeof(bool))
+                return (T)(object)(data[0] != 0);
+
+            if (typeof(T) == typeof(byte))
+                return (T)(object)data[0];
+
+            throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {typeof(T).Name}銆傛敮鎸佺殑绫诲瀷锛歜ool, byte, short, int, ushort, uint, float");
         }
 
         /// <summary>
         /// 灏嗗�肩被鍨嬭浆鎹负瀛楄妭鏁扮粍
+        /// 浣跨敤澶х瀛楄妭搴忥紙Big-Endian锛夛紝涓嶴7 PLC瑙勮寖涓�鑷�
         /// </summary>
+        /// <exception cref="NotSupportedException">绫诲瀷涓嶆敮鎸佹椂鎶涘嚭</exception>
         private byte[] ConvertToBytes<T>(T value) where T : struct
         {
             if (typeof(T) == typeof(short))
@@ -530,37 +637,64 @@
             if (typeof(T) == typeof(ushort))
                 return new[] { (byte)((ushort)(object)value >> 8), (byte)((ushort)(object)value & 0xFF) };
 
+            if (typeof(T) == typeof(uint))
+                return new[] {
+                    (byte)((uint)(object)value >> 24),
+                    (byte)(((uint)(object)value >> 16) & 0xFF),
+                    (byte)(((uint)(object)value >> 8) & 0xFF),
+                    (byte)((uint)(object)value & 0xFF)
+                };
+
             if (typeof(T) == typeof(float))
-                return BitConverter.GetBytes((float)(object)value);
+            {
+                var bytes = BitConverter.GetBytes((float)(object)value);
+                // BitConverter榛樿浣跨敤绯荤粺瀛楄妭搴忥紝闇�瑕佽浆鎹负澶х
+                if (BitConverter.IsLittleEndian)
+                    Array.Reverse(bytes);
+                return bytes;
+            }
 
             if (typeof(T) == typeof(bool))
                 return new[] { (byte)((bool)(object)value ? 1 : 0) };
 
-            throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {typeof(T).Name}");
+            if (typeof(T) == typeof(byte))
+                return new[] { (byte)(object)value };
+
+            throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {typeof(T).Name}銆傛敮鎸佺殑绫诲瀷锛歜ool, byte, short, int, ushort, uint, float");
         }
 
         /// <summary>
         /// 瀵煎嚭DB鍖烘暟鎹�
+        /// 瀵煎嚭鎵�鏈塂B鍧楃殑杩炵画鏁版嵁
+        /// 娉ㄦ剰锛欴B鍖烘敮鎸佽嚜鍔ㄥ垱寤哄潡锛屽鍑烘椂鍙寘鍚凡鍒涘缓鐨勫潡
         /// </summary>
         private byte[] ExportDBRegion()
         {
-            // 绠�鍖栫増鏈細瀵煎嚭鎵�鏈塂B鍧楃殑杩炵画鏁版嵁
-            // 瀹為檯瀹炵幇鍙兘闇�瑕佹洿澶嶆潅鐨勫簭鍒楀寲鏍煎紡
             var result = new List<byte>();
             for (ushort i = 1; i <= _config.DBBlockCount; i++)
             {
-                var blockData = _dbRegion.Read(i, 0, (ushort)_config.DBBlockSize);
-                result.AddRange(blockData);
+                try
+                {
+                    var blockData = _dbRegion.Read(i, 0, (ushort)_config.DBBlockSize);
+                    result.AddRange(blockData);
+                }
+                catch (ArgumentException)
+                {
+                    // DB鍧椾笉瀛樺湪锛岃烦杩�
+                    // 濉厖0浠ヤ繚鎸佽繛缁��
+                    result.AddRange(new byte[_config.DBBlockSize]);
+                }
             }
             return result.ToArray();
         }
 
         /// <summary>
         /// 瀵煎叆DB鍖烘暟鎹�
+        /// 鎸夐『搴忓鍏ユ墍鏈塂B鍧�
+        /// 娉ㄦ剰锛欴B鍖烘敮鎸佽嚜鍔ㄥ垱寤哄潡锛堝鏋滃啓鍏ユ椂鍧椾笉瀛樺湪锛�
         /// </summary>
         private void ImportDBRegion(byte[] data)
         {
-            // 绠�鍖栫増鏈細鎸夐『搴忓鍏ユ墍鏈塂B鍧�
             int offset = 0;
             for (ushort i = 1; i <= _config.DBBlockCount && offset < data.Length; i++)
             {

--
Gitblit v1.9.3