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

如何检查COM dll是否已注册到C#?,c#,registry,C#,Registry,我需要检查msdia100.dll是否已在我正在运行的计算机系统上注册,以便使用命令regsvr32.exe注册该dll。如何使用C#实现这一点?请查看HKEY#U CLASSES\u ROOT\CLSID\\InprocServer上的rgistry。如果您有该记录,则应该注册DLL。您可以在注册表中搜索该记录。假设您不知道DLL中包含的COM对象,则必须首先在HKEY_CLASSES\u ROOT中查找DLL名称 然后使用类名在HKEY\U CLASSES\U ROOT\[ClassName

我需要检查msdia100.dll是否已在我正在运行的计算机系统上注册,以便使用命令
regsvr32.exe
注册该dll。如何使用C#实现这一点?

请查看HKEY#U CLASSES\u ROOT\CLSID\\InprocServer上的rgistry。如果您有该记录,则应该注册DLL。

您可以在注册表中搜索该记录。假设您不知道DLL中包含的COM对象,则必须首先在
HKEY_CLASSES\u ROOT
中查找DLL名称

然后使用类名在
HKEY\U CLASSES\U ROOT\[ClassName]\CLSID
中查找CLSID,最后您应该能够在CLSID中找到它,即
HKEY\U CLASSES\U ROOT\CLSID\[CLSID]

请注意,注册表位置是从内存写入的,因此可能有点不正确


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

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

[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);    
}

<> >注册表的方法是好的,值得做的,但要确保您也可以考虑在COTE对象内封装一个在Test{} catch(COMExchange){}中的东西,如果有一个CeExchange被捕获,那么就给用户提供一些有意义的东西。

< P>使用微软.win32,RegistryKey < /P >验证是否存在密钥。
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;

假设您知道COM dll的CLSID,您只需检查在
HKEY_CLASSES\u ROOT\CLSID\{COM组件的CLSID}
HKEY_CLASSES\u ROOT\Wow6432Node\CLSID\{COM组件的CLSID}
(Wow6432Node=>32位COM在64位机器上注册)

e、 g


特别是因为注册表比它看起来复杂得多,因为有不同的仿真层,32/64位等等。我认为这一点都不正确。它加载任何DLL,不管它是否注册为COM对象的宿主。@Steve,您是按名称加载DLL,而不是按完整路径加载的。如果dll加载,则它已注册。如果没有,则尚未注册。除非您要查找的dll恰好也在您的路径中。请澄清,LoadLibrary后跟DllGetClassObject(带有接口的CLSID和IID)为您提供了COM对象的实例。如果加载库失败,它将无法工作,句号。如果加载DLL,这是因为在路径上找到了DLL。如果将DLL放入当前目录或C:\Windows\System32或其他任何可以找到的地方,则LoadLibrary将正常工作。在这一点上,DllGetClassObject也是如此,但这并没有告诉我们什么。谁投你的票都错了。
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;
    }
}