2 using System.Collections.Generic;
\r
3 using Microsoft.Win32;
\r
5 namespace NaGet.InteropServices
\r
8 /// ICatManagerの暫定的かつピュアC#実装。レジストリを舐めてICatManagerと同等の機能を実現する。
\r
10 internal class GuidEnumeratorForCategories : IEnumerable<Guid>, IDisposable
\r
12 private RegistryKey key;
\r
14 private string[] subkeys;
\r
16 private Guid catGuid;
\r
18 public GuidEnumeratorForCategories(Guid category)
\r
20 key = Registry.ClassesRoot.OpenSubKey(@"CLSID", false);
\r
21 subkeys = key.GetSubKeyNames();
\r
25 public void Dispose()
\r
30 GC.SuppressFinalize(this);
\r
34 public IEnumerator<Guid> GetEnumerator()
\r
36 return _getEnumerator();
\r
39 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
\r
41 return _getEnumerator();
\r
44 private IEnumerator<Guid> _getEnumerator()
\r
46 // レジストリ内のImplemented Category内の値と比較する値
\r
47 string strCategory = catGuid.ToString("B").ToUpper();
\r
49 foreach (string subkey in subkeys) {
\r
50 // "CLSID"、基本タイプ("...046}")は無視する
\r
51 if ((subkey == "CLSID") ||
\r
52 subkey.EndsWith("-0000-0000-C000-000000000046}", StringComparison.OrdinalIgnoreCase)) {
\r
56 // Implemented Categoryにあれば、subkeyをGUIDに変換して返す
\r
57 RegistryKey guidKey = key.OpenSubKey(string.Format(@"{0}\Implemented Categories\{1}", subkey, strCategory), false);
\r
58 if (guidKey != null) {
\r
60 yield return new Guid(subkey);
\r