当前位置: 代码迷 >> C# >> C#工程怎么添加64位的OCX组件
  详细解决方案

C#工程怎么添加64位的OCX组件

热度:97   发布时间:2016-05-05 04:39:31.0
C#工程如何添加64位的OCX组件
OCX是用C++写的,同一个C#工程,在32位系统上添加32位的OCX组件没有问题,在64位机器上添加64位的OCX组件却不成功。首先通过工具箱来添加64位的OCX组件时,在COM Components选项卡中就没有找到已经手动注册成功的64位OCX,通过下面的浏览来添加OCX,却弹出Self Registration for XXX.ocx failed的提示,结果也加载不成功。
我将32位的OCX拿到64位机器上,成功注册,并且通过工具箱在COM Components选项卡中也能找到并成功添加32位的OCX。

请问,该如果添加64位的OCX组件?
------解决思路----------------------
标记下.以后用的着的
------解决思路----------------------
果断收藏了。。。。。。。
------解决思路----------------------
开发环境也是普通的32位应用程序,不可能同时支持32位和64位设计时控件,至于开发好的应用,如果是.NET的,可能会根据运行机器的环境自适应,因为它其实是中间语言。
------解决思路----------------------

  public static class RegisterOcx
    {
        private static string _systemDic = string.Empty;
        /// 检测是32bit or 64bit,进行对应位置注册。
        /// 注册成功之后启动Pad
        public static void RegisterOcxControl()
        {
            try
            {
                const string fileName = "dsoframer.ocx";
                bool type = Environment.Is64BitOperatingSystem;
                 _systemDic = Environment.SystemDirectory;
                if (type)
                {
                    //64bit
                    _systemDic = _systemDic.Replace("system32", "SysWOW64");
                }
                _systemDic = _systemDic + "\\" + fileName;
                //是否存在
                if (!File.Exists(_systemDic))
                {
                    string libPath = AppDomain.CurrentDomain.BaseDirectory + "\\Libs\\" + fileName;
                    File.Copy(libPath, _systemDic, true);
            
                }
                System.Threading.Thread thread = new System.Threading.Thread(DoRegistry);
                thread.SetApartmentState(System.Threading.ApartmentState.STA);
                thread.Start();
               
            }
            catch (Exception ex)
            {
                Logger.Error("RegisterOcxControl error" + ex.ToString());
                throw;
            }
        }

        private static void DoRegistry()
        {
            try
            {
                //是否注册
                //{00460182-9E5E-11d5-B7C8-B8269041DD57}对应的是空间的注册表中ClSID的值,每一个OCX空间CLSID都不一样。
                //如果更换空间,则该值需要到注册表中查找,路径为:HKEY_CLASSES_ROOT\CLSID\{00460182-9E5E-11d5-B7C8-B8269041DD57}
                RegistryKey registry = Registry.ClassesRoot.OpenSubKey("CLSID\\{00460182-9E5E-11d5-B7C8-B8269041DD57}\\");
                if (registry == null)
                {//没有注册时
                    new Command().Execute(string.Format(@"Regsvr32.exe {0}", _systemDic));
                }
            }
            catch (Exception)
            {
                new Command().Execute(string.Format(@"Regsvr32.exe {0}", _systemDic));
            }
        }
    }


以前写的一个注册dsoframer.ocx ,同时进行了双重检测并注册 。
32bit 和 64bit的差别是 注册路径"system32"替换成 "SysWOW64"。
new Command().Execute是执行cmd命令,用其他的方式执行cmd都可以
命令是:Regsvr32.exe {0}   ,{0} 是注册的路径。
例如:
Regsvr32.exe "C:\Windows\SysWOW64\dsoframer.ocx" 

regsvr32 好像有个\s命令,可以静默注册。
  相关解决方案