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

时间:2011-02-11 07:16:00

标签: c# registry

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

6 个答案:

答案 0 :(得分:4)

注册表方法是可以的并且值得做,但是为了确保您也可以考虑在try {} catch(COMException){}中包含的COM对象中实例化某些东西,然后在COMException时向用户呈现一些合理的东西。被抓住了。

答案 1 :(得分:4)

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

e.g。

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

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:2)

使用Microsoft.Win32.RegistryKey验证密钥是否存在

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;

答案 4 :(得分:1)

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

答案 5 :(得分:-1)

这是正确的方法。它确实涉及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);    
}