private void LoadInterfaces(RegistryKey rootKey)
{
Dictionary<Guid, COMInterfaceEntry> interfaces = new Dictionary<Guid, COMInterfaceEntry>();
COMInterfaceEntry unk = COMInterfaceEntry.CreateKnownInterface(COMInterfaceEntry.KnownInterfaces.IUnknown);
interfaces.Add(unk.Iid, unk);
unk = COMInterfaceEntry.CreateKnownInterface(COMInterfaceEntry.KnownInterfaces.IMarshal);
interfaces.Add(unk.Iid, unk);
using (RegistryKey iidKey = rootKey.OpenSubKey("Interface"))
{
if (iidKey != null)
{
string[] subkeys = iidKey.GetSubKeyNames();
foreach (string key in subkeys)
{
Guid iid;
if (Guid.TryParse(key, out iid))
{
if (!interfaces.ContainsKey(iid))
{
using (RegistryKey regKey = iidKey.OpenSubKey(key))
{
if (regKey != null)
{
COMInterfaceEntry ent = new COMInterfaceEntry(iid, regKey);
interfaces.Add(iid, ent);
if (ent.ProxyClsid != Guid.Empty)
{
if (m_clsids.ContainsKey(ent.ProxyClsid))
{
m_clsids[ent.ProxyClsid].AddProxy(ent);
}
}
}
}
}
}
}
}
}
int pos = 0;
m_interfacebyname = new COMInterfaceEntry[interfaces.Count];
foreach (COMInterfaceEntry ent in interfaces.Values)
{
m_interfacebyname[pos++] = ent;
}
Array.Sort(m_interfacebyname);
m_interfaces = new SortedDictionary<Guid, COMInterfaceEntry>(interfaces);
}