diff --git a/PInvoke/Shared/FieldValueHash.cs b/PInvoke/Shared/FieldValueHash.cs index 91772b04..bfb79e12 100644 --- a/PInvoke/Shared/FieldValueHash.cs +++ b/PInvoke/Shared/FieldValueHash.cs @@ -8,6 +8,7 @@ namespace Vanara.PInvoke; /// Gets a static field's name from its value and caches the list for faster lookups. public static class StaticFieldValueHash { + private static readonly object cacheLock = new(); private static readonly Dictionary<(Type, Type), IDictionary> cache = []; /// Adds the seqence of field values to the associated cache. @@ -63,7 +64,12 @@ public static class StaticFieldValueHash hash = typeof(TType).GetFields(BindingFlags.Public | BindingFlags.Static). Where(fi => fi.FieldType == typeof(TFieldType)).Distinct(FIValueComp.Default). ToDictionary(fi => fi.GetValue(null)!.GetHashCode(), fi => (fi.Name, null)); - cache.Add(tt, hash); + lock (cacheLock) +#if NET5_0_OR_GREATER || NETCOREAPP + cache.TryAdd(tt, hash); +#else + { if (!cache.ContainsKey(tt)) cache.Add(tt, hash); } +#endif } var ret = hash.TryGetValue(value.GetHashCode(), out var t); fieldName = t.Item1;