如何检查DLL文件是否已注册?

时间:2009-03-27 09:37:18

标签: c# .net

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

我已经尝试过这段代码了,但它没有结束。

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

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

鲍勃,你会自己更换这段代码,对我来说还是很难吗?

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

最后一个答案是进行一些修改。我查看了typelib而不是clsid。

耳朵: 无论如何,我做了一点修改。它现在正在运作。

7 个答案:

答案 0 :(得分:20)

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

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

用GUID替换x。

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

答案 1 :(得分:5)

如果您的意思是在GAC注册,请注意以下事项:要在GAC注册,必须使用强名称签署程序集(其名称中包含公钥标记)。

因此,您可以尝试使用Assembly.Load(string)加载它,如果您有FileNotFoundException - 汇编未在GAC中注册。

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

答案 2 :(得分:3)

您可以使用:

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

“gEncrypt.clsEncrypt”是ComName.ClassName。

答案 3 :(得分: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;
}

答案 4 :(得分:2)

如果你知道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-位机)

以下是一个例子:

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

答案 5 :(得分: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);    
}

答案 6 :(得分:1)

  1. 声明指向Interface
  2. 的指针
  3. 在CLSID和IID上调用CoCreateInstance
  4. 如果返回值不是S_OK,则表示未注册课程