How to register COM usercontrol in 64bit Windows 7 system?

EDN Admin

Well-known member
Joined
Aug 7, 2010
Messages
12,794
Location
In the Machine
Hi,
I created a COM control in C# Windows Forms usercontrol, which is getting registered properly in Windows 7 32 bit system with RegAsm.exe (Regasm.exe myControl.dll /Codebase). The dll platform target is AnyCPU.
After registration, COM control is exposed to MS excel 32 bit and I am able to access it.
I have uploaded the control for you reference https://skydrive.live.com/?cid=ab034720ad5419bf&sc=documents&id=AB034720AD5419BF%21147#cid=AB034720AD5419BF&id=AB034720AD5419BF%21326&sc=documents" target="_blank" title="Sample Code
here
Now i want register the same control for 64 bit office.
But I am unable to register it in 64 bit Office.
Can someone please look into my COMRegisterFunction and COMRegisterFunction and correct me?
I have gone through lots of forums but nothing helped me.
Even i tried with the following code also but it didnt work. Sometimes it got registered under HKEY_LOCAL_MACHINE instead of HKEY_CLASSES_ROOT.
[ComRegisterFunction]<br/>
static void ComRegister(Type t)<br/>
{
if (Environment.Is64BitOperatingSystem)<br/>
{<br/>
string keyName = @"Wow6432NodeCLSID" + t.GUID.ToString("B");
RegistrySecurity rs = new RegistrySecurity();<br/>
RegistryAccessRule rar = new RegistryAccessRule(Environment.UserDomainName + "\" + Environment.UserName,<br/>

RegistryRights.FullControl,<br/>

InheritanceFlags.ObjectInherit,<br/>

PropagationFlags.InheritOnly,<br/>

AccessControlType.Allow);
rs.AddAccessRule(rar);
Thread.Sleep(100);<br/>
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.WriteKey))<br/>
{<br/>
//key.DeleteSubKey("Control", false);<br/>
key.CreateSubKey("Control", RegistryKeyPermissionCheck.ReadWriteSubTree, rs).Close();<br/>
//key.DeleteSubKey("MiscStatus", false);<br/>
using (RegistryKey subkey = key.CreateSubKey("MiscStatus", RegistryKeyPermissionCheck.ReadWriteSubTree, rs))<br/>
{<br/>
// 131456 decimal == 0x20180.<br/>
long val = (long)(OLEMISC.OLEMISC_INSIDEOUT | OLEMISC.OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC.OLEMISC_SETCLIENTSITEFIRST);<br/>
subkey.SetValue("", val);<br/>
}<br/>
//key.DeleteSubKey("TypeLib", false);<br/>
using (RegistryKey subkey = key.CreateSubKey("TypeLib", RegistryKeyPermissionCheck.ReadWriteSubTree, rs))<br/>
{<br/>
Guid libid = Marshal.GetTypeLibGuidForAssembly(t.Assembly);<br/>
subkey.SetValue("", libid.ToString("B"));<br/>
}<br/>
//key.DeleteSubKey("Version", false);<br/>
using (RegistryKey subkey = key.CreateSubKey("Version", RegistryKeyPermissionCheck.ReadWriteSubTree, rs))<br/>
{<br/>
Version ver = t.Assembly.GetName().Version;<br/>
string version = string.Format("{0}.{1}", ver.Major, ver.Minor);<br/>
subkey.SetValue("", version);<br/>
}<br/>
// Next create the CodeBase entry - needed if not string named and GACced.<br/>
//key.DeleteSubKeyTree("InprocServer32", false);<br/>
using (RegistryKey subkey = key.OpenSubKey("InprocServer32", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl))<br/>
{<br/>
subkey.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);<br/>
}<br/>
// Finally close the main key<br/>
}<br/>
}<br/>
else<br/>
{<br/>
string keyName = @"CLSID" + t.GUID.ToString("B");<br/>
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName, true))<br/>
{<br/>
key.CreateSubKey("Control").Close();<br/>
using (RegistryKey subkey = key.CreateSubKey("MiscStatus"))<br/>
{<br/>
// 131456 decimal == 0x20180.<br/>
long val = (long)(OLEMISC.OLEMISC_INSIDEOUT | OLEMISC.OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC.OLEMISC_SETCLIENTSITEFIRST);<br/>
subkey.SetValue("", val);<br/>
}<br/>
using (RegistryKey subkey = key.CreateSubKey("TypeLib"))<br/>
{<br/>
Guid libid = Marshal.GetTypeLibGuidForAssembly(t.Assembly);<br/>
subkey.SetValue("", libid.ToString("B"));<br/>
}<br/>
using (RegistryKey subkey = key.CreateSubKey("Version"))<br/>
{<br/>
Version ver = t.Assembly.GetName().Version;<br/>
string version = string.Format("{0}.{1}", ver.Major, ver.Minor);<br/>
subkey.SetValue("", version);<br/>
}<br/>
// Next create the CodeBase entry - needed if not string named and GACced.<br/>
using (RegistryKey subkey = key.OpenSubKey("InprocServer32", true))<br/>
{<br/>
subkey.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);<br/>
}<br/>
// Finally close the main key<br/>
}<br/>
}<br/>
}
[ComUnregisterFunction]<br/>
static void ComUnregister(Type t)<br/>
{<br/>
// Delete the entire CLSID{clsid} subtree for this component.
<br/>
if (Environment.Is64BitOperatingSystem)<br/>
{<br/>
string keyName = @"Wow6432NodeCLSID" + t.GUID.ToString("B");<br/>
RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.WriteKey);<br/>
if (key != null)<br/>
{<br/>
key.DeleteSubKeyTree(keyName, false);<br/>
}
<br/>
}<br/>
else<br/>
{<br/>
string keyName = @"CLSID" + t.GUID.ToString("B");<br/>
Registry.ClassesRoot.DeleteSubKeyTree(keyName);<br/>
}<br/>
} <hr class="sig Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This will help other members to find the solution easily.

View the full article
 
Back
Top