3
我正在爲VS2010中的UML序列圖構建命令擴展,並需要在當前解決方案中實現特定接口的類型列表。如何從擴展中訪問類型和程序集信息?到目前爲止,我所有的嘗試都只列出了在原擴展項目中加載的程序集,而不是VS正在編輯的程序集。從VS2010擴展的當前解決方案中獲取組件的類型信息
我正在爲VS2010中的UML序列圖構建命令擴展,並需要在當前解決方案中實現特定接口的類型列表。如何從擴展中訪問類型和程序集信息?到目前爲止,我所有的嘗試都只列出了在原擴展項目中加載的程序集,而不是VS正在編輯的程序集。從VS2010擴展的當前解決方案中獲取組件的類型信息
這裏的解決方案,我終於趕到,使用LINQ來簡化搜索:
DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE));
var types = from Project project in dte.Solution.Projects
from Reference reference in (References)project.Object.References
where reference.Type == prjReferenceType.prjReferenceTypeAssembly
from t in Assembly.LoadFile(reference.Path).GetTypes()
where t != typeof(IInterface) && typeof(IInterface).IsAssignableFrom(t)
select t;
通過包含在當前打開的解決方案的所有項目,該塊搜索,得到所有的引用,加載它是那些程序集,並搜索它們以實現接口的類型。
請注意,您正在使用Reflection將所有這些程序集加載到devenv.exe中,這意味着它們正在消耗內存,並且直到devenv.exe死亡後才能釋放此內存。 (這可能與你無關,只是說...避免這種情況的替代方案可能是使用MonoCecil而不是Reflection) –
使用內存不是一個大問題,因爲這是一個設計時操作,但我仍然遇到這個解決方案的一些麻煩。有時它不會加載程序集的所有依賴關係,並且GetTypes()調用會引發ReflectionTypeLoadException。我不確定如何在調用GetTypes()之前確保依賴性已加載或至少可用,因此如果有另一種方法可以執行此操作,則可能最好。 – shader