【问题标题】:Get type information from assemblies in current solution from VS2010 extension从 VS2010 扩展的当前解决方案中的程序集获取类型信息
【发布时间】:2011-07-08 17:07:23
【问题描述】:

我正在为 VS2010 中的 UML 序列图构建命令扩展,并且需要在当前解决方案中实现特定接口的类型列表。如何从扩展中访问类型和程序集信息?到目前为止,我所有的尝试都只是列出了在原始扩展项目中加载的程序集,而不是 VS 当前正在编辑的程序集。

【问题讨论】:

    标签: visual-studio visual-studio-2010 vsx envdte


    【解决方案1】:

    这是我最终得出的解决方案,使用 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;
    

    此块搜索当前打开的解决方案中包含的所有项目,获取它们的所有引用,加载作为程序集的那些,并在它们中搜索实现接口的类型。

    【讨论】:

    • 请注意,您正在使用反射将所有这些程序集加载到 devenv.exe 中,这意味着它们正在消耗内存,并且在 devenv.exe 终止之前您无法释放此内存。 (这对你来说可能无关紧要,只是说......避免这种情况的替代方法可能是使用 MonoCecil 而不是反射)
    • 使用内存并不是什么大问题,因为这是一个设计时操作,但我仍然在使用这个解决方案时遇到了一些问题。有时它不会加载程序集的所有依赖项,并且 GetTypes() 调用会引发 ReflectionTypeLoadException。我不确定如何确保依赖项已加载,或者至少在调用 GetTypes() 之前可用,因此最好有其他方法来执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多