如何检查COM dll是否已注册到C#?
我需要检查msdia100.dll是否已在我正在运行的计算机系统上注册,以便使用命令如何检查COM dll是否已注册到C#?,c#,registry,C#,Registry,我需要检查msdia100.dll是否已在我正在运行的计算机系统上注册,以便使用命令regsvr32.exe注册该dll。如何使用C#实现这一点?请查看HKEY#U CLASSES\u ROOT\CLSID\\InprocServer上的rgistry。如果您有该记录,则应该注册DLL。您可以在注册表中搜索该记录。假设您不知道DLL中包含的COM对象,则必须首先在HKEY_CLASSES\u ROOT中查找DLL名称 然后使用类名在HKEY\U CLASSES\U ROOT\[ClassName
regsvr32.exe
注册该dll。如何使用C#实现这一点?请查看HKEY#U CLASSES\u ROOT\CLSID\\InprocServer上的rgistry。如果您有该记录,则应该注册DLL。您可以在注册表中搜索该记录。假设您不知道DLL中包含的COM对象,则必须首先在HKEY_CLASSES\u ROOT
中查找DLL名称
然后使用类名在HKEY\U CLASSES\U ROOT\[ClassName]\CLSID
中查找CLSID,最后您应该能够在CLSID中找到它,即HKEY\U CLASSES\U ROOT\CLSID\[CLSID]
请注意,注册表位置是从内存写入的,因此可能有点不正确
编辑:或者,如果您知道类名,您可以尝试创建一个实例,看看它是否有效。这是正确的方法。它确实涉及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);
}
<> >注册表的方法是好的,值得做的,但要确保您也可以考虑在COTE对象内封装一个在Test{} catch(COMExchange){}中的东西,如果有一个CeExchange被捕获,那么就给用户提供一些有意义的东西。 < P>使用微软.win32,RegistryKey < /P >验证是否存在密钥。
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;
假设您知道COM dll的CLSID,您只需检查在
HKEY_CLASSES\u ROOT\CLSID\{COM组件的CLSID}
或HKEY_CLASSES\u ROOT\Wow6432Node\CLSID\{COM组件的CLSID}
(Wow6432Node=>32位COM在64位机器上注册)
e、 g
特别是因为注册表比它看起来复杂得多,因为有不同的仿真层,32/64位等等。我认为这一点都不正确。它加载任何DLL,不管它是否注册为COM对象的宿主。@Steve,您是按名称加载DLL,而不是按完整路径加载的。如果dll加载,则它已注册。如果没有,则尚未注册。除非您要查找的dll恰好也在您的路径中。请澄清,LoadLibrary后跟DllGetClassObject(带有接口的CLSID和IID)为您提供了COM对象的实例。如果加载库失败,它将无法工作,句号。如果加载DLL,这是因为在路径上找到了DLL。如果将DLL放入当前目录或C:\Windows\System32或其他任何可以找到的地方,则LoadLibrary将正常工作。在这一点上,DllGetClassObject也是如此,但这并没有告诉我们什么。谁投你的票都错了。
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;
}
}