如何以編程方式檢查GAC的程序集?檢查GAC的程序集
回答
您可以使用Fusion COM API。張俊峯寫了一個managed wrapper。不過,從2004年開始,所以我不知道它的效果如何。
你想探討一個組件的GAC,或者你只是想知道該組件存在於機器上嗎?
如果你不在乎程序集實際上是在GAC中,但只是可以在機器上加載(從appdomain),你可以使用程序集名稱(強,普通,完整等)的LoadAssembly。如果程序集可以通過Fusion加載,那麼你會知道它存在。
即使不想變得複雜,你也可以剔除gacutil
並捕獲輸出。例如,gacutil /l Microsoft.Practices.Unity
給我:
Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.
The Global Assembly Cache contains the following assemblies:
Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31
bf3856ad364e35, processorArchitecture=MSIL
Number of items = 1
與gacutil /l Some.Nonexistant.Assembly
:
Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.
The Global Assembly Cache contains the following assemblies:
Number of items = 0
這是很容易實現和分析,不依賴於任何第三方實現。
刪除'gacutil.exe'並捕獲輸出是我對過度複雜的定義,我喜歡儘可能簡單:)如果在使用gacutil和Fusion API之間,它可能會有爭議。看到我的答案在這裏:http://stackoverflow.com/a/19459379/1004119。 – 2013-10-18 21:41:59
在.NET中,如果反射API - Assembly.Load(...)
未找到程序集,它將拋出FileNotFoundException
。 API需要一個完全合格的程序集名稱,所以我認爲它必須位於GAC中。我正在使用它來測試SQL Server精簡版的存在:
Assembly foo = Assembly.Load("System.Data.SqlServerCe, Version=3.5.1.0, " +
"Culture=neutral, PublicKeyToken=89845dcd8080cc91");
Assembly.Load還搜索其他位置:默認加載上下文包含通過探測全局程序集緩存找到的程序集,如果運行時宿主(例如SQL Server)中的主機程序集存儲區,以及應用程序的ApplicationBase和PrivateBinPath域。 - http://msdn.microsoft.com/cs-cz/library/dd153782.aspx – Bohdan 2011-10-08 18:01:53
也許這是一個想法,將其與http://msdn.microsoft.com/en-us/library/system結合使用。 reflection.assembly.globalassemblycache(v = vs.110).aspx GlobalAssemblyCache屬性 – ErikEJ 2014-02-21 12:10:50
最好使用ReflectionOnlyLoad
方法。此方法將程序集加載到僅反射的上下文中,在該上下文中它可以被檢查但不被執行。
- 1. 檢查批處理文件中GAC中是否有程序集
- 2. 如何檢查GAC中是否存在程序集引用?
- 3. GAC - 程序集在GAC中,但「無法加載文件或程序集」
- 4. nuget的程序集由GAC的程序集覆蓋
- 5. 枚舉遠程GAC程序集
- 6. GAC +配置中的.NET程序集
- 7. 安裝程序集到GAC的問題
- 8. 如何引用GAC中的程序集?
- 9. 如何引用GAC中的程序集
- 10. 如何覆蓋GAC中的程序集
- 11. 如何使用GAC中的程序集?
- 12. 使用PowerShell查看全局程序集緩存(GAC)的內容
- 13. 我如何從GAC加載程序集?
- 14. 如何在GAC中引用程序集
- 15. 如何從GAC中引用程序集?
- 16. 在GAC中安裝程序集
- 17. C#:如何從GAC加載程序集?
- 18. 從Inno Setup向GAC添加程序集
- 19. ClickOnce需要程序集MyProject在GAC中?
- 20. 爲什麼程序集加載程序未檢入C++/CLI混合模式程序集的GAC?
- 21. 爲什麼我的程序不能在GAC中查找程序集?
- 22. 部署的.NET程序如何在GAC中引用程序集?
- 23. App.Config中的GAC程序集參考(控制檯應用程序)
- 24. 如何從動態生成的程序集中引用GAC程序集?
- 25. WPF應用程序在GAC中註冊程序集?
- 26. 使用Windows安裝程序向GAC安裝程序集
- 27. 檢查程序集的強名
- 28. 檢查程序集的權限
- 29. Clickonce部署程序集必須安裝在全局程序集緩存(GAC)中
- 30. 如何將.net程序集添加到全局程序集緩存(GAC)
使用基於COM的Fusion API是正確的方法,但嘗試使用Assembly.Load並捕獲FileNotFoundException更容易。 – 2010-02-20 22:33:36
@Mike Post:但它也有將程序集加載到應用程序域中的不幸副作用,這並不是真正需要的。易用性並不總是勝過正確性(我認爲它很少這麼做)。 – casperOne 2011-05-30 15:22:46
ReflectionOnlyLoad具有將程序集加載到應用程序域的相同副作用。閱讀文檔中的細則。這不得不使用複雜的非託管COM Fusion API。 – 2011-06-01 21:30:03