如何获取所有已加载类型?

showjim 2015-01-10 10:50:46
不是Assembly.GetTypes()获取程序集中定义的类型,而是要运行时已经加载的类型,包括所有已经加载的具体泛型类型。
...全文
403 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南小鱼 2015-01-10
  • 打赏
  • 举报
回复
Assembly是反射dll,获取运行时的类型,你就遍历类对象呗。
江南小鱼 2015-01-10
  • 打赏
  • 举报
回复
引用 7 楼 sbwwkmyd 的回复:
[quote=引用 4 楼 github_22161131 的回复:] 你说的“已加载”是什么概念?没有具体的说明那只能认为是appdomain加载的所有assembly里面的类型。 就是使用AppDomain.CurrentDomain.GetAssemblies()获得所有已加载的assembly,然后从这些assembly上GetTypes
assembly.GetTypes()仅仅是类型定义而已,我要的是运行时JIT创建的具体类型。
引用 5 楼 lovelj2012 的回复:
msdn有答案 http://msdn.microsoft.com/zh-cn/library/b8ytshk6(v=vs.110).aspx
如果你还不明白,就不要回了,谢谢。
引用 6 楼 github_22161131 的回复:
csdn的缓存刷新的够慢的... 貌似除了profiler api那种东西,是无法查找所有运行时创建的具体泛型类型的。还是根据具体需求,想想别的办法吧。
谢谢,就是想要类似的API,希望不是第三方的。[/quote] List<T>,你不是要知道运行的时候T的实际(String、Int32、或者是一个Class)类型么?
showjim 2015-01-10
  • 打赏
  • 举报
回复
引用 8 楼 github_22161131 的回复:
又找了找,从.net的TypeSpec这个元数据表里面取是可以找到静态定义的泛型类型。比如代码里用到的List<int>这种。不过这肯定要使用第三方工具,比如cecil或者dnlib,来直接解析元数据。但是这样仍然不可能获得Type.MakeGenericType动态构造的具体泛型类型。 profiler api倒是官方的,但是这个一般是调试场景使用,可以监视所有对象的创建。那显然是可以找到所有运行时对象和其类型的。不过这个方案很麻烦,并且肯定严重影响性能。
谢谢回复。是的,profiler api不是我想要的东西,我只是想找到所有的类型,监视每一个对象代价太大,看来还得继续找找看。
winnowc 2015-01-10
  • 打赏
  • 举报
回复
又找了找,从.net的TypeSpec这个元数据表里面取是可以找到静态定义的泛型类型。比如代码里用到的List<int>这种。不过这肯定要使用第三方工具,比如cecil或者dnlib,来直接解析元数据。但是这样仍然不可能获得Type.MakeGenericType动态构造的具体泛型类型。 profiler api倒是官方的,但是这个一般是调试场景使用,可以监视所有对象的创建。那显然是可以找到所有运行时对象和其类型的。不过这个方案很麻烦,并且肯定严重影响性能。
showjim 2015-01-10
  • 打赏
  • 举报
回复
引用 4 楼 github_22161131 的回复:
你说的“已加载”是什么概念?没有具体的说明那只能认为是appdomain加载的所有assembly里面的类型。 就是使用AppDomain.CurrentDomain.GetAssemblies()获得所有已加载的assembly,然后从这些assembly上GetTypes
assembly.GetTypes()仅仅是类型定义而已,我要的是运行时JIT创建的具体类型。
引用 5 楼 lovelj2012 的回复:
msdn有答案 http://msdn.microsoft.com/zh-cn/library/b8ytshk6(v=vs.110).aspx
如果你还不明白,就不要回了,谢谢。
引用 6 楼 github_22161131 的回复:
csdn的缓存刷新的够慢的... 貌似除了profiler api那种东西,是无法查找所有运行时创建的具体泛型类型的。还是根据具体需求,想想别的办法吧。
谢谢,就是想要类似的API,希望不是第三方的。
winnowc 2015-01-10
  • 打赏
  • 举报
回复
csdn的缓存刷新的够慢的... 貌似除了profiler api那种东西,是无法查找所有运行时创建的具体泛型类型的。还是根据具体需求,想想别的办法吧。
江南小鱼 2015-01-10
  • 打赏
  • 举报
回复
引用 3 楼 sbwwkmyd 的回复:
[quote=引用 1 楼 lovelj2012 的回复:]Assembly是反射dll,获取运行时的类型,你就遍历类对象呗。
引用 2 楼 lovelj2012 的回复:
http://bbs.csdn.net/topics/300148460 http://blog.csdn.net/findsafety/article/details/21942119
举个简单的例子,程序运行时new List<int>,然后我在哪里可以找到这个List<int>类型,而不是List<T>?[/quote] msdn有答案 http://msdn.microsoft.com/zh-cn/library/b8ytshk6(v=vs.110).aspx
winnowc 2015-01-10
  • 打赏
  • 举报
回复
你说的“已加载”是什么概念?没有具体的说明那只能认为是appdomain加载的所有assembly里面的类型。 就是使用AppDomain.CurrentDomain.GetAssemblies()获得所有已加载的assembly,然后从这些assembly上GetTypes
showjim 2015-01-10
  • 打赏
  • 举报
回复
引用 1 楼 lovelj2012 的回复:
Assembly是反射dll,获取运行时的类型,你就遍历类对象呗。
引用 2 楼 lovelj2012 的回复:
http://bbs.csdn.net/topics/300148460 http://blog.csdn.net/findsafety/article/details/21942119
举个简单的例子,程序运行时new List<int>,然后我在哪里可以找到这个List<int>类型,而不是List<T>?

111,089

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧