我需要檢查msdia100.dll是否在我運行的計算機系統上註冊,以便用命令regsvr32.exe
註冊dll。我怎樣才能用C#做到這一點?如何檢查COM DLL是否註冊或不與C#?
9
A
回答
3
您可以通過註冊表進行搜索。假設您不知道DLL中包含的COM對象,則必須先開始在HKEY_CLASSES_ROOT
中查找DLL名稱。
然後使用類名來查找HKEY_CLASSES_ROOT\[ClassName]\CLSID
中的CLSID,最後您應該能夠找到它作爲HKEY_CLASSES_ROOT\CLSID\[CLSID]
的CLSID。
請注意,從內存中寫入的註冊表位置可能會有點偏離。
編輯:或者,如果您知道類名稱,您可以嘗試創建它的一個實例並查看它是否有效。
1
查看位於HKEY_CLASSES_ROOT \ CLSID \\ InprocServer的rgistry。如果你有這個記錄,那麼這個DLL應該被註冊。
-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);
}
4
註冊表的方法是可以的,值得做的事情,但可以肯定,你也可以考慮從包裝在一個try {}趕上COM對象中實例化的東西(收到COMException){},那麼現在一些明智的用戶是否遇到COMException。
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
假設你知道COM DLL的CLSID存在鍵,你可以檢查是否有與上CLSID的關鍵HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component}
或HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component}
(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;
}
}
相關問題
- 1. COM dll不再註冊
- 2. 如何檢查ActiveX DLL是否已經註冊?
- 3. 如何檢查.NET DLL是否已註冊?
- 4. 追蹤GAC註冊的COM + C#dll
- 5. 如何在VS2008中註冊COM DLL
- 6. 如何檢查在Windows註冊的DLL?
- 7. 無法註冊.NET COM DLL
- 8. 用IIS7.5註冊COM .dll(REGDB_E_CLASSNOTREG)
- 9. 在c#中引用COM DLL如果COM未註冊怎麼辦
- 10. 檢測COM對象是否已註冊或實例化(iTunes)
- 11. 如何檢查tlb文件是否使用C++在註冊表中註冊?
- 12. 如何在c#dll和vC++ dll中註冊免費激活COM dll?
- 13. 如何在C++中加載已註冊的COM DLL
- 14. 如何使用C#檢查註冊表值是否存在?
- 15. vb.net:測試運行時是否註冊了一個com dll
- 16. 檢查DLL是否使用Inno Setup註冊
- 17. COM程序如何找到爲COM Interop註冊的.NET DLL?
- 18. 如何確定我的DLL是否正在註冊或執行?
- 19. Windows 7 64位dll註冊與Windows 8.1 64位dll註冊
- 20. Microsoft.SmartDevice.Connectivity是否已正確註冊COM?
- 21. 將.dll註冊到COM時出錯
- 22. 使用.NET註冊com對象dll
- 23. DllMain freeze當註冊一個COM DLL時
- 24. 使用regsvr32取消註冊COM DLL
- 25. 免註冊COM和DLL位置
- 26. 註冊免費的COM和DLL清單
- 27. 用WiX在GAC中註冊COM DLL
- 28. com:使用未註冊的dll
- 29. 如何控制與C#或註冊表
- 30. 檢查jQuery「Fancybox」是否已經註冊?
我不相信這是完全正確的。它加載*任何* DLL,無論它是否註冊爲託管COM對象。 – 2011-02-11 09:00:26
@Steve,你正在加載一個DLL的名稱,而不是一個完整的路徑。如果該DLL加載它已被註冊。如果沒有,它還沒有被註冊。除非你正在尋找的DLL也碰巧在你的路上。 – 2011-02-11 09:32:48
爲了清楚起見,LoadLibrary後跟DllGetClassObject(帶有CLSID和接口的IID)爲您提供了一個可以使用的COM對象的實例。如果加載庫失敗,那麼這段時間不起作用。 – 2011-02-11 09:44:29