33

如何以编程方式查找用 C# 编写的 DLL 文件是否已注册?

我已经尝试过这段代码,但它没有成功。

如果我注册一个 DLL 文件并使用它返回的代码进行检查。如果我取消注册并运行同一段代码,它会再次返回 true。我将 DLL 文件的完整路径作为参数。

我们用Visual C++开发了一个简单的 DLL 文件。之后我们注册了它。现在我们要确认它是否已注册。

Bob,你会自己替换那段代码吗,对我来说还是很难吗?

如果我注册一个 DLL 文件,注册表中是否存在条目?我是否应该找到那些条目并判断DLL文件是否已注册?

4

7 回答 7

22

您需要找出 DLL 中定义的 COM 对象的 GUID。然后查看这个注册表项:

HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32

将 x 替换为 GUID。

它应该有一个包含 DLL 完整路径的默认值。

于 2009-03-27T10:10:39.953 回答
5

如果您的意思是在 GAC 中注册,这是我的考虑:要在 GAC 中注册,程序集必须使用强名称(名称中包含公钥令牌)进行签名。

所以你可以尝试使用加载它Assembly.Load(string),如果你得到FileNotFoundException- 程序集没有在 GAC 中注册。

如果没有错误,但结果Assembly.GetName().GetPublicKeyToken()为 null 或为空 - 这意味着您在应用程序目录中找到了程序集,而不是在 GAC 中。

于 2009-03-27T09:48:13.643 回答
3

你可以使用这个:

My.Computer.Registry.ClassesRoot.GetSubKeyNames.Contains("gEncrypt.clsEncrypt")

其中“gEncrypt.clsEncrypt”是 ComName.ClassName。

于 2011-06-01T16:12:34.110 回答
3

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

这是一个例子:

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;
    }
}
于 2015-12-05T01:12:50.167 回答
2
  1. 声明一个指向接口的指针
  2. 在 CLSID 和 IID 上调用 CoCreateInstance
  3. 如果返回值不是 S_OK 则类未注册
于 2009-03-27T09:40:39.947 回答
2
class TestDll
{
    //Import your tested DLL here
    [DllImport("kernel32")]
    public extern static int LoadLibrary(string lpLibFileName);
}

try
{
    TestDll test = new TestDll();
}
catch(DllNotFoundException ex)
{
    return false;
}
于 2010-11-19T14:52:47.563 回答
1
[DllImport("kernel32")]    
public extern static bool FreeLibrary(int hLibModule);

[DllImport("kernel32")]    
public extern static int LoadLibrary(string lpLibFileName);



public bool IsDllRegistered(string DllName)    
{

      int libId = LoadLibrary(DllName);    
      if (libId>0) FreeLibrary(libId);    
      return (libId>0);    
}
于 2009-03-27T09:40:01.290 回答