diff --git a/binding/csharp/IP2Region.Net.Test/SearcherTest.cs b/binding/csharp/IP2Region.Net.Test/SearcherTest.cs
index 1c85420..46ba960 100644
--- a/binding/csharp/IP2Region.Net.Test/SearcherTest.cs
+++ b/binding/csharp/IP2Region.Net.Test/SearcherTest.cs
@@ -78,6 +78,8 @@ public class SearcherTest
searcher.Search("58.251.27.201");
Assert.Equal(3, searcher.IoCount);
+
+ searcher.Dispose();
}
[Fact]
@@ -89,6 +91,8 @@ public class SearcherTest
searcher.Search("58.251.27.201");
Assert.Equal(2, searcher.IoCount);
+
+ searcher.Dispose();
}
[Fact]
@@ -100,6 +104,8 @@ public class SearcherTest
searcher.Search("58.251.27.201");
Assert.Equal(0, searcher.IoCount);
+
+ searcher.Dispose();
}
[Theory]
diff --git a/binding/csharp/IP2Region.Net/Abstractions/ISearcher.cs b/binding/csharp/IP2Region.Net/Abstractions/ISearcher.cs
index 657716f..b8cf052 100644
--- a/binding/csharp/IP2Region.Net/Abstractions/ISearcher.cs
+++ b/binding/csharp/IP2Region.Net/Abstractions/ISearcher.cs
@@ -12,7 +12,7 @@ namespace IP2Region.Net.Abstractions;
///
/// IP 转化为地理位置搜索器接口
///
-public interface ISearcher
+public interface ISearcher : IDisposable
{
///
/// 搜索方法
diff --git a/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs
index 693518e..020a959 100644
--- a/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs
+++ b/binding/csharp/IP2Region.Net/Internal/ContentCacheStrategy.cs
@@ -14,7 +14,14 @@ class ContentCacheStrategy : FileCacheStrategy
public ContentCacheStrategy(string xdbPath) : base(xdbPath)
{
_cacheData = base.GetData(0, (int)XdbFileStream.Length);
+ XdbFileStream.Close();
+ XdbFileStream.Dispose();
}
public override ReadOnlyMemory GetData(long offset, int length) => _cacheData.Slice((int)offset, length);
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(false);
+ }
}
diff --git a/binding/csharp/IP2Region.Net/Internal/FileCacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/FileCacheStrategy.cs
index 224976a..00310e1 100644
--- a/binding/csharp/IP2Region.Net/Internal/FileCacheStrategy.cs
+++ b/binding/csharp/IP2Region.Net/Internal/FileCacheStrategy.cs
@@ -60,4 +60,26 @@ class FileCacheStrategy(string xdbPath) : ICacheStrategy
ArrayPool.Shared.Return(buffer);
}
}
+
+ ///
+ /// 释放文件句柄
+ ///
+ ///
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ XdbFileStream.Close();
+ XdbFileStream.Dispose();
+ }
+ }
+
+ ///
+ ///
+ ///
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
}
diff --git a/binding/csharp/IP2Region.Net/Internal/ICacheStrategy.cs b/binding/csharp/IP2Region.Net/Internal/ICacheStrategy.cs
index 0f01d4c..3d05b31 100644
--- a/binding/csharp/IP2Region.Net/Internal/ICacheStrategy.cs
+++ b/binding/csharp/IP2Region.Net/Internal/ICacheStrategy.cs
@@ -7,7 +7,7 @@
namespace IP2Region.Net.Internal;
-internal interface ICacheStrategy
+internal interface ICacheStrategy : IDisposable
{
int IoCount { get; }
diff --git a/binding/csharp/IP2Region.Net/XDB/Searcher.cs b/binding/csharp/IP2Region.Net/XDB/Searcher.cs
index 81186b5..abccb75 100644
--- a/binding/csharp/IP2Region.Net/XDB/Searcher.cs
+++ b/binding/csharp/IP2Region.Net/XDB/Searcher.cs
@@ -147,4 +147,13 @@ public class Searcher(CachePolicy cachePolicy, string xdbPath) : ISearcher
}
return ret;
}
+
+ ///
+ ///
+ ///
+ public void Dispose()
+ {
+ _cacheStrategy.Dispose();
+ GC.SuppressFinalize(this);
+ }
}