正在检查DLL是否已注册

本文关键字:注册 是否 DLL 检查 | 更新日期: 2023-09-27 18:27:35

我正在检查注册表项HKEY_CLASSES_ROOT'CLSID'{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'InprocServer32,看看是否注册了托管.NET DLL。

我从得到的Guid(x)

    public static string AssemblyClassIDString(System.Reflection.Assembly assembly)
    {
        object[] objects = assembly.GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false);
        if (objects.Length > 0)
        {
            return ((System.Runtime.InteropServices.GuidAttribute)objects[0]).Value;
        }
        else
        {
            return String.Empty;
        }
    }

函数返回一个GUID,但不是与CLSID下注册表中的GUID匹配的GUID。有人知道为什么这不起作用吗?

感谢

正在检查DLL是否已注册

CLSID注册表项与类型关联,而不是与程序集关联。Regasm.exe使用Type.GUID属性来确定要写入的密钥。换句话说,您必须迭代assembly.GetTypes()。首先检查[ComVisible]属性,然后检查guid。请注意,可以使用[ComRegisterFunction]属性自定义注册,这样类似的代码就不是slamdunk。

程序集的guid实际上已被使用,它生成类型库guid,即LIBID。在HKCR''Typelib中注册类型库是非常罕见的,它只需要使您的组件出现在COM导入浏览器上,或者如果您想使用COM标准整理器进行跨单元或进程互操作。背景信息可在此处获取。

确保COM服务器注册的最佳方法是只注册它。多次注册不是问题。

我一直认为,检查COM DLL是否注册的最可靠方法是尝试从库中创建类型。

也许您可以按照此操作,而不是检查注册表,尝试从库中获取任何已知类型的Type.GetTypeFromProgID类型引用,然后使用Activator.CreateInstance创建一个实例。

DLL是常规COM还是注册为COM.

的.NET应该无关紧要