How do I find whether a DLL file written in C# is registered or not programmatically?
I already tried this code, but it doesn\'t come off.
If I register a DL
[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);
}
You can use this:
My.Computer.Registry.ClassesRoot.GetSubKeyNames.Contains("gEncrypt.clsEncrypt")
Where "gEncrypt.clsEncrypt" is ComName.ClassName.
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;
}
If you mean registered in GAC, here is my consideration: to be registered in GAC, an assembly must be signed with a strong name (have a public key token in it's name).
So you can try load it using Assembly.Load(string), if you got FileNotFoundException - assembly was not registered in GAC.
If got no error, but result Assembly.GetName().GetPublicKeyToken() is null or empty -- this mean you found assembly in application directory, not in GAC.
If you know the CLSID of the COM dll, you can just check if there's a key with that CLSID on HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component} or HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component} (Wow6432Node => 32-bit COM registered on a 64-bit machine)
Here is an example:
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;
}
}