我正在检查注册表项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。有谁知道为什么这不起作用?
由于
答案 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服务器的最佳方法是注册它。不止一次这样做不是问题。