Я создал 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);
}
}