检查DLL是否已注册

时间:2012-03-11 12:11:14

标签: c# com

我正在检查注册表项HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32以查看是否已注册托管的.NET DLL。

Guid(x's)我来自

    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。有谁知道为什么这不起作用?

由于

2 个答案:

答案 0 :(得分:1)

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

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

如果您的DLL是常规COM或注册为COM的.NET,则无关紧要。

答案 1 :(得分:1)

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

实际上使用了程序集的guid,它生成了类型库guid,即LIBID。将类型库注册到HKCR \ Typelib是非常罕见的,只需要让您的组件出现在COM导入浏览器中,或者如果您想使用COM标准编组器来进行跨公寓或进程互操作。背景信息为available here

确保注册COM服务器的最佳方法是注册它。不止一次这样做不是问题。