none
如何获取到当前VisualStudio工程的所有引用,并从中获取指定类型的所有继承? RRS feed

  • 问题

  • 如题,如何获取到当前VisualStudio工程的所有引用,并从中获取指定类型的所有继承?

    就像是 Visual Studio 中“工具箱”可以显示在当前工程所有引用到的程序集中的控件一样。

    如何实现?


    哈哈哈哈
    2010年4月1日 3:23

答案

  • 哦,好吧,怪我没说明白。

     

    我需要做一个控件,拉到窗体上之后,在属性窗口里选择一个集合属性“SubControls”,然后弹出一个窗体,里面显示可以使用的控件列表。这个列表中的控件包括 System.Windows.Forms 中的控件,包括通过“添加引用”引用的程序集的控件,包括通过“添加引用”引用的解决方案中的其他工程中的控件等等…… 我怎么得到当前正在操作的 Visual Studio 工程? 怎么得到那个工程的所有引用?


    哈哈哈哈


    我说了,用 VS SDK 是可以得到当前项目的,不过,您的程序是一个 Visual Studio Extension?如果不是,那其他人拿到程序后运行则不可能得到正确的结果。

    您的问题可以通过反射整个 AppDomain 上的类型,然后判断该类型是不是继承自 System.Windows.Forms.Control 或者 System.Windows.Forms.UserControl 就可以了。所有引用的程序集上的类型应该都可以得到。


    Mark Zhou
    2010年4月1日 8:14
  • 你好!

         VS是如何具体是如何做的,我们是无法知道的,我猜测是用反射来做的,或是通过即时编译来获得的,如果你的程序不使用VS SDK那你无法获取这些信息,这些信息并不对普通的应用程序开放!


    周雪峰
    2010年4月1日 12:06
    版主

全部回复

  • 你可以打开工程文件(如.csproj),里面有这个信息,如下:
    <ItemGroup>
        <Reference Include="Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL" />
        <Reference Include="System" />
        <Reference Include="System.Data" />
        <Reference Include="System.Deployment" />
        <Reference Include="System.Drawing" />
        <Reference Include="System.Windows.Forms" />
        <Reference Include="System.Xml" />
      </ItemGroup>

    family as water
    2010年4月1日 6:36
  • 用 Visual Studio SDK 就可以了,用 VSProject 试试看。
    Mark Zhou
    2010年4月1日 8:01
  • 哦,好吧,怪我没说明白。

     

    我需要做一个控件,拉到窗体上之后,在属性窗口里选择一个集合属性“SubControls”,然后弹出一个窗体,里面显示可以使用的控件列表。这个列表中的控件包括 System.Windows.Forms 中的控件,包括通过“添加引用”引用的程序集的控件,包括通过“添加引用”引用的解决方案中的其他工程中的控件等等…… 我怎么得到当前正在操作的 Visual Studio 工程? 怎么得到那个工程的所有引用?


    哈哈哈哈
    2010年4月1日 8:04
  • 哦,好吧,怪我没说明白。

     

    我需要做一个控件,拉到窗体上之后,在属性窗口里选择一个集合属性“SubControls”,然后弹出一个窗体,里面显示可以使用的控件列表。这个列表中的控件包括 System.Windows.Forms 中的控件,包括通过“添加引用”引用的程序集的控件,包括通过“添加引用”引用的解决方案中的其他工程中的控件等等…… 我怎么得到当前正在操作的 Visual Studio 工程? 怎么得到那个工程的所有引用?


    哈哈哈哈


    我说了,用 VS SDK 是可以得到当前项目的,不过,您的程序是一个 Visual Studio Extension?如果不是,那其他人拿到程序后运行则不可能得到正确的结果。

    您的问题可以通过反射整个 AppDomain 上的类型,然后判断该类型是不是继承自 System.Windows.Forms.Control 或者 System.Windows.Forms.UserControl 就可以了。所有引用的程序集上的类型应该都可以得到。


    Mark Zhou
    2010年4月1日 8:14

  • 哦,好吧,怪我没说明白。

    我需要做一个控件,拉到窗体上之后,在属性窗口里选择一个集合属性“SubControls”,然后弹出一个窗体,里面显示可以使用的控件列表。这个列表中的控件包括 System.Windows.Forms 中的控件,包括通过“添加引用”引用的程序集的控件,包括通过“添加引用”引用的解决方案中的其他工程中的控件等等…… 我怎么得到当前正在操作的 Visual Studio 工程? 怎么得到那个工程的所有引用?



    哈哈哈哈


    我说了,用 VS SDK 是可以得到当前项目的,不过,您的程序是一个 Visual Studio Extension?如果不是,那其他人拿到程序后运行则不可能得到正确的结果。
    您的问题可以通过反射整个 AppDomain 上的类型,然后判断该类型是不是继承自 System.Windows.Forms.Control 或者 System.Windows.Forms.UserControl 就可以了。所有引用的程序集上的类型应该都可以得到。
    Mark Zhou

    谢谢 Mark Zhou 
    如果按照此种做法,那么获得的便全是 Visual Studio 2008 程序本身的控件。
    我要求的是获取当前项目(就是拉这个控件到的那个窗体所在的那个项目)所有可用的控件。Visual Studio 的工具栏是怎么做到自动从相关项目和程序集中获取所有可用的控件的?

    哈哈哈哈
    2010年4月1日 10:18
  • 你好!

         VS是如何具体是如何做的,我们是无法知道的,我猜测是用反射来做的,或是通过即时编译来获得的,如果你的程序不使用VS SDK那你无法获取这些信息,这些信息并不对普通的应用程序开放!


    周雪峰
    2010年4月1日 12:06
    版主