我需要检查msdia100.dll是否在我正在运行的计算机系统上注册,以便使用命令regsvr32.exe
注册dll。我怎么能用C#做到这一点?
答案 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);
}