[coop] Temporarily restore MonoThreadInfo when TLS destructor runs. Fixes #43099
[mono.git] / mcs / class / referencesource / System.Runtime.Caching / System / Caching / SRef.cs
1 // <copyright file="SRef.cs" company="Microsoft">
2 //   Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
3 // </copyright>
4 using System;
5 using System.Globalization;
6 using System.Reflection;
7 using System.Security;
8 using System.Security.Permissions;
9 using System.Diagnostics.CodeAnalysis;
10
11 namespace System.Runtime.Caching {
12     internal class SRef {
13         private static Type s_type = Type.GetType("System.SizedReference", true, false);
14         private Object _sizedRef;
15
16         internal SRef(Object target) {
17             _sizedRef = Activator.CreateInstance(s_type,
18                     BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.CreateInstance,
19                     null,
20                     new object[] { target },
21                     null);
22         }
23
24         internal long ApproximateSize {
25             [SecuritySafeCritical]
26             [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
27             get {
28                 object o = s_type.InvokeMember("ApproximateSize",
29                                                BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty,
30                                                null, // binder
31                                                _sizedRef, // target
32                                                null, // args
33                                                CultureInfo.InvariantCulture);
34                 return (long)o;
35             }
36         }
37
38         // 
39         [SuppressMessage("Microsoft.Security", "CA2106:SecureAsserts", Justification = "Grandfathered suppression from original caching code checkin")]
40         [SecuritySafeCritical]
41         [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
42         internal void Dispose() {
43             s_type.InvokeMember("Dispose",
44                                 BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
45                                 null, // binder
46                                 _sizedRef, // target
47                                 null, // args
48                                 CultureInfo.InvariantCulture);
49         }
50     }
51 }