Implement MachineKey.Protect and MachineKey.Unprotect
[mono.git] / mcs / class / System.ComponentModel.Composition / src / ComponentModel / System / ComponentModel / Composition / ReflectionModel / DisposableReflectionComposablePart.cs
1 \r
2 // -----------------------------------------------------------------------\r
3 // Copyright (c) Microsoft Corporation.  All rights reserved.\r
4 // -----------------------------------------------------------------------\r
5 using System;\r
6 using System.Collections.Generic;\r
7 using System.ComponentModel.Composition.Hosting;\r
8 using System.ComponentModel.Composition.Primitives;\r
9 using System.Diagnostics.CodeAnalysis;\r
10 using System.Globalization;\r
11 using System.Linq;\r
12 using System.Reflection;\r
13 using Microsoft.Internal;\r
14 using Microsoft.Internal.Collections;\r
15 using System.Threading;\r
16 \r
17 namespace System.ComponentModel.Composition.ReflectionModel\r
18 {\r
19     internal sealed class DisposableReflectionComposablePart : ReflectionComposablePart, IDisposable\r
20     {\r
21         private volatile int _isDisposed = 0;\r
22 \r
23         public DisposableReflectionComposablePart(ReflectionComposablePartDefinition definition)\r
24             : base(definition)\r
25         {\r
26         }\r
27 \r
28         protected override void ReleaseInstanceIfNecessary(object instance)\r
29         {\r
30             IDisposable disposable = instance as IDisposable;\r
31             if (disposable != null)\r
32             {\r
33                 disposable.Dispose();\r
34             }\r
35         }\r
36 \r
37         protected override void EnsureRunning()\r
38         {\r
39             base.EnsureRunning();\r
40             if (this._isDisposed == 1)\r
41             {\r
42                 throw ExceptionBuilder.CreateObjectDisposed(this);\r
43             }\r
44         }\r
45 \r
46         void IDisposable.Dispose()\r
47         {\r
48             // NOTE : According to http://msdn.microsoft.com/en-us/library/4bw5ewxy.aspx, the warning is bogus when used with Interlocked API.\r
49 #pragma warning disable 420\r
50             if (Interlocked.CompareExchange(ref this._isDisposed, 1, 0) == 0)\r
51 #pragma warning restore 420\r
52             {\r
53                 this.ReleaseInstanceIfNecessary(this.CachedInstance);\r
54             }\r
55         }\r
56     }\r
57 }\r