2011-07-08 26 views
3

我正在爲VS2010中的UML序列圖構建命令擴展,並需要在當前解決方案中實現特定接口的類型列表。如何從擴展中訪問類型和程序集信息?到目前爲止,我所有的嘗試都只列出了在原擴展項目中加載的程序集,而不是VS正在編輯的程序集。從VS2010擴展的當前解決方案中獲取組件的類型信息

回答

5

這裏的解決方案,我終於趕到,使用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; 

通過包含在當前打開的解決方案的所有項目,該塊搜索,得到所有的引用,加載它是那些程序集,並搜索它們以實現接口的類型。

+1

請注意,您正在使用Reflection將所有這些程序集加載到devenv.exe中,這意味着它們正在消耗內存,並且直到devenv.exe死亡後才能釋放此內存。 (這可能與你無關,只是說...避免這種情況的替代方案可能是使用MonoCecil而不是Reflection) –

+0

使用內存不是一個大問題,因爲這是一個設計時操作,但我仍然遇到這個解決方案的一些麻煩。有時它不會加載程序集的所有依賴關係,並且GetTypes()調用會引發ReflectionTypeLoadException。我不確定如何在調用GetTypes()之前確保依賴性已加載或至少可用,因此如果有另一種方法可以執行此操作,則可能最好。 – shader

相關問題