.NET中的ActiveX,mscoree.dll

时间:2015-05-13 16:04:42

标签: c# vba dll activex

我在c#VS2013中制作了一些activeX用于报告。我注册(doring building,也是regasm),我做了一个msi安装程序,基本上我的插件正在运行。我在VBA上使用它。我可以对它进行一次引用并使用一个控件包装器,但问题是,只有当我将它放在显示器(或winForm)上时我才能使用它。之后,当我保存,关闭,再次打开时,我收到消息:

  

无法加载ActiveX控件进行显示。原因:ClassLibrary1.UserControl1:服务器上缺少CAB文件:http://localhost/RSViewActiveXControlSetup/mscoreedll.CAB

(RSView是一种可以使用VBA代码进行显示的编程环境)

然后我必须删除并再次放置。无法在运行时使用-only test。

我的代码中的注册部分:

[ComRegisterFunction]
    static void ComRegister(Type t)
    {
        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"))
            {
                subkey.SetValue("", "131457");
            }
            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);
                if (version == "0.0") version = "1.0";
                subkey.SetValue("", version);
            }
        }
    }

注册已更新,我认为正确。我有红色mscoree.dll有问题,但我还没找到解决方法。我会非常考虑任何帮助,我有点不高兴。 .NET 4.5.51209

2 个答案:

答案 0 :(得分:1)

FT View SE(RSView SE)由于某些原因找不到运行regasm时注册为InprocServer32的mscoree.dll。 放入完整路径(“C:\ Windows \ SysWow64 \ mscoree.dll”)为我修复了这个问题。

答案 1 :(得分:0)

您必须更改密钥" InprocServer32"使用系统寄存器中mscorre.dll的完整路径。 Image of System Register

或者您更改了ComRegisterFunction:

    [ComRegisterFunction()]
    public static void RegisterFunction(Type _type)
    {
        // Check your class type here 
        if (_type != null )
        {
            string sCLSID = "CLSID\\" + _type.GUID.ToString("B");
            try
            {
                RegistryKey _key = Registry.ClassesRoot.OpenSubKey(sCLSID, true);
                try
                {
                    Guid _libID = Marshal.GetTypeLibGuidForAssembly(_type.Assembly);
                    int _major, _minor;
                    Marshal.GetTypeLibVersionForAssembly(_type.Assembly, out _major, out _minor);
                    using (RegistryKey _sub = _key.CreateSubKey("Control")) { }
                    using (RegistryKey _sub = _key.CreateSubKey("MiscStatus")) { _sub.SetValue("", "0", RegistryValueKind.String); }
                    using (RegistryKey _sub = _key.CreateSubKey("TypeLib")) { _sub.SetValue("", _libID.ToString("B"), RegistryValueKind.String); }
                    using (RegistryKey _sub = _key.CreateSubKey("Version")) { _sub.SetValue("", String.Format("{0}.{1}", _major, _minor), RegistryValueKind.String); }
                    using (RegistryKey _sub = _key.CreateSubKey("Control")) { }

                    using (RegistryKey _sub = _key.CreateSubKey("InprocServer32")) { _sub.SetValue("", Environment.SystemDirectory + "\\" + _sub.GetValue("", "mscoree.dll"), RegistryValueKind.String); }
                }
                finally
                {
                    _key.Close();
                }
            }
            catch
            {
            }
        }
    }