如何检查COM dll是否已注册C#?

我需要检查msdia100.dll是否在我正在运行的计算机系统上注册,以便使用命令regsvr32.exe注册dll。 我怎么能用C#做到这一点?

您可以在注册表中搜索此内容。 假设您不知道DLL中包含的COM对象,您必须首先在HKEY_CLASSES_ROOT开始查找DLL名称。

然后使用类名在HKEY_CLASSES_ROOT\[ClassName]\CLSID查找HKEY_CLASSES_ROOT\[ClassName]\CLSID ,最后您应该能够将CLSID作为HKEY_CLASSES_ROOT\CLSID\[CLSID]找到它。

请注意,从内存写入的注册表位置可能有点偏。

编辑:或者,如果您知道类名,您可以尝试创建它的实例,看看它是否有效。

注册表方法是可以的,值得做,但是为了确保你也可以考虑在try {} catch(COMException){}中包含的COM对象中实例化一些东西,然后在遇到COMException时向用户提供一些合理的东西。

假设你知道COM dll的CLSID,你可以检查在HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component}HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component}上是否有一个带有该CLSID的密钥HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component} (Wow6432Node =>在64位机器上注册的32位COM)

例如

 private bool IsAlreadyRegistered() { using (var classesRootKey = Microsoft.Win32.RegistryKey.OpenBaseKey( Microsoft.Win32.RegistryHive.ClassesRoot, Microsoft.Win32.RegistryView.Default)) { const string clsid = "{12345678-9012-3456-7890-123456789012}"; var clsIdKey = classesRootKey.OpenSubKey(@"Wow6432Node\CLSID\" + clsid) ?? classesRootKey.OpenSubKey(@"CLSID\" + clsid); if (clsIdKey != null) { clsIdKey.Dispose(); return true; } return false; } } 

使用Microsoft.Win32.RegistryKeyvalidation密钥是否存在

 var key = Microsoft.Win32.RegistryKey.OpenBaseKey( Microsoft.Win32.RegistryHive.ClassesRoot, Microsoft.Win32.RegistryView.Default) .OpenSubKey("Interface") //replace with your COM object GUID .OpenSubKey("{a3560000-0000-0000-c63b3-000000cbadf0000}"); return key != null; 

查看HKEY_CLASSES_ROOT \ CLSID \\ InprocServer中的rgistry。 如果您有该记录,则应该注册DLL。

这是正确的方法。 它确实涉及PInvoke,但这只是因为它们没有直接在.NET中提供此function。

 [DllImport("kernel32")] public extern static int LoadLibrary(string lpLibFileName); [DllImport("kernel32")] public extern static bool FreeLibrary(int hLibModule); public bool IsDllRegistered(string DllName) { int libId = LoadLibrary(DllName); if (libId>0) FreeLibrary(libId); return (libId>0); }