Как зарегистрировать COM usercontrol в 64-битной системе Windows 7? - PullRequest
1 голос
/ 05 января 2012

Я создал COM-элемент управления в C # usercontrol Windows Forms, который правильно регистрируется в 32-разрядной системе Windows 7 с помощью RegAsm.exe (Regasm.exe myControl.dll / Codebase). Цель платформы dll - AnyCPU.

После регистрации COM-контроль подвергается воздействию MS Excel 32 bit, и я могу получить к нему доступ.

Я загрузил элемент управления для вашей ссылки здесь

Теперь я хочу зарегистрировать тот же элемент управления для 64-битного офиса.

Но я не могу зарегистрировать его в 64-битном Office.

Может кто-нибудь взглянуть на мои COMRegisterFunction и COMRegisterFunction и исправить меня?

Я прошел много форумов, но мне ничего не помогло.

Даже я пытался с помощью следующего кода, но это не сработало. Иногда он регистрировался под HKEY_LOCAL_MACHINE вместо HKEY_CLASSES_ROOT.

    [ComRegisterFunction]
    static void ComRegister(Type t)
    {

        if (Environment.Is64BitOperatingSystem)
        {
            string keyName = @"Wow6432Node\CLSID\" + t.GUID.ToString("B");

            RegistrySecurity rs = new RegistrySecurity();
            RegistryAccessRule rar = new RegistryAccessRule(Environment.UserDomainName + "\\" + Environment.UserName,
                                                            RegistryRights.FullControl,
                                                            InheritanceFlags.ObjectInherit,
                                                            PropagationFlags.InheritOnly,
                                                            AccessControlType.Allow);

            rs.AddAccessRule(rar);

            Thread.Sleep(100);
            using (RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.WriteKey))
            {
                //key.DeleteSubKey("Control", false);
                key.CreateSubKey("Control", RegistryKeyPermissionCheck.ReadWriteSubTree, rs).Close();
                //key.DeleteSubKey("MiscStatus", false);
                using (RegistryKey subkey = key.CreateSubKey("MiscStatus", RegistryKeyPermissionCheck.ReadWriteSubTree, rs))
                {
                    // 131456 decimal == 0x20180.
                    long val = (long)(OLEMISC.OLEMISC_INSIDEOUT | OLEMISC.OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC.OLEMISC_SETCLIENTSITEFIRST);
                    subkey.SetValue("", val);
                }
                //key.DeleteSubKey("TypeLib", false);
                using (RegistryKey subkey = key.CreateSubKey("TypeLib", RegistryKeyPermissionCheck.ReadWriteSubTree, rs))
                {
                    Guid libid = Marshal.GetTypeLibGuidForAssembly(t.Assembly);
                    subkey.SetValue("", libid.ToString("B"));
                }
                //key.DeleteSubKey("Version", false);
                using (RegistryKey subkey = key.CreateSubKey("Version", RegistryKeyPermissionCheck.ReadWriteSubTree, rs))
                {
                    Version ver = t.Assembly.GetName().Version;
                    string version = string.Format("{0}.{1}", ver.Major, ver.Minor);
                    subkey.SetValue("", version);
                }
                // Next create the CodeBase entry - needed if not string named and GACced.
                //key.DeleteSubKeyTree("InprocServer32", false);
                using (RegistryKey subkey = key.OpenSubKey("InprocServer32", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl))
                {
                    subkey.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
                }
                // Finally close the main key
            }
        }
        else
        {
            string keyName = @"CLSID\" + t.GUID.ToString("B");
            using (RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName, true))
            {
                key.CreateSubKey("Control").Close();
                using (RegistryKey subkey = key.CreateSubKey("MiscStatus"))
                {
                    // 131456 decimal == 0x20180.
                    long val = (long)(OLEMISC.OLEMISC_INSIDEOUT | OLEMISC.OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC.OLEMISC_SETCLIENTSITEFIRST);
                    subkey.SetValue("", val);
                }
                using (RegistryKey subkey = key.CreateSubKey("TypeLib"))
                {
                    Guid libid = Marshal.GetTypeLibGuidForAssembly(t.Assembly);
                    subkey.SetValue("", libid.ToString("B"));
                }
                using (RegistryKey subkey = key.CreateSubKey("Version"))
                {
                    Version ver = t.Assembly.GetName().Version;
                    string version = string.Format("{0}.{1}", ver.Major, ver.Minor);
                    subkey.SetValue("", version);
                }
                // Next create the CodeBase entry - needed if not string named and GACced.
                using (RegistryKey subkey = key.OpenSubKey("InprocServer32", true))
                {
                    subkey.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
                }
                // Finally close the main key
            }
        }
    }

    [ComUnregisterFunction]
    static void ComUnregister(Type t)
    {
        // Delete the entire CLSID\{clsid} subtree for this component.            
        if (Environment.Is64BitOperatingSystem)
        {
            string keyName = @"Wow6432Node\CLSID\" + t.GUID.ToString("B");
            RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.WriteKey);
            if (key != null)
            {
                key.DeleteSubKeyTree(keyName, false);
            }  
        }
        else
        {
            string keyName = @"CLSID\" + t.GUID.ToString("B");
            Registry.ClassesRoot.DeleteSubKeyTree(keyName);
        }
    }
...