正在检查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。有人知道为什么这不起作用吗?
感谢
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.