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

.Net技术 码拜 7年前 (2015-03-20) 1222次浏览 0个评论

不是Assembly.GetTypes()获取程序集中定义的类型,而是要运行时已经加载的类型,包括所有已经加载的具体泛型类型。

 
如何获取运行时所有已加载类型?
Assembly是反射dll,获取运行时的类型,你就遍历类对象呗。
如何获取运行时所有已加载类型?
http://bbs.csdn.net/topics/300148460
如何获取运行时所有已加载类型?
引用 1 楼 lovelj2012 的回复:

Assembly是反射dll,获取运行时的类型,你就遍历类对象呗。

引用:

http://bbs.csdn.net/topics/300148460
http://blog.csdn.net/findsafety/article/details/21942119

举个简单的例子,程序运行时new List<int>,然后我在哪里可以找到这个List<int>类型,而不是List<T>?

如何获取运行时所有已加载类型?
你说的“已加载”是什么概念?没有具体的说明那只能认为是appdomain加载的所有assembly里面的类型。
就是使用AppDomain.CurrentDomain.GetAssemblies()获得所有已加载的assembly,然后从这些assembly上GetTypes
如何获取运行时所有已加载类型?
引用 3 楼 sbwwkmyd 的回复:
Quote: 引用 1 楼 lovelj2012 的回复:

Assembly是反射dll,获取运行时的类型,你就遍历类对象呗。

fieldset>

引用 2 楼 lovelj2012 的回复:

http://bbs.csdn.net/topics/300148460
a href=”http://blog.csdn.net/findsafety/article/details/21942119″ target=”_blank”>http://blog.csdn.net/findsafety/article/details/21942119

举个简单的例子,程序运行时new List<int>,然后我在哪里可以找到这个List<int>类型,而不是List<T>?
span style=”color: #FF0000;”>msdn有答案
a href=”http://msdn.microsoft.com/zh-cn/library/b8ytshk6(v=vs.110).aspx” target=”_blank”>http://msdn.microsoft.com/zh-cn/library/b8ytshk6(v=vs.110).aspx

如何获取运行时所有已加载类型?
300分
csdn的缓存刷新的够慢的…
貌似除了profiler api那种东西,是无法查找所有运行时创建的具体泛型类型的。还是根据具体需求,想想别的办法吧。
如何获取运行时所有已加载类型?
引用 4 楼 github_22161131 的回复:

你说的“已加载”是什么概念?没有具体的说明那只能认为是appdomain加载的所有assembly里面的类型。
就是使用AppDomain.CurrentDomain.GetAssemblies()获得所有已加载的assembly,然后从这些assembly上GetTypes

assembly.GetTypes()仅仅是类型定义而已,我要的是运行时JIT创建的具体类型。
fieldset>

引用 5 楼 lovelj2012 的回复:

msdn有答案
http://msdn.microsoft.com/zh-cn/library/b8ytshk6(v=vs.110).aspx

如果你还不明白,就不要回了,谢谢。
fieldset>

引用 6 楼 github_22161131 的回复:

csdn的缓存刷新的够慢的…
貌似除了profiler api那种东西,是无法查找所有运行时创建的具体泛型类型的。还是根据具体需求,想想别的办法吧。

谢谢,就是想要类似的API,希望不是第三方的。

如何获取运行时所有已加载类型?
又找了找,从.net的TypeSpec这个元数据表里面取是可以找到静态定义的泛型类型。比如代码里用到的List<int>这种。不过这肯定要使用第三方工具,比如cecil或者dnlib,来直接解析元数据。但是这样仍然不可能获得Type.MakeGenericType动态构造的具体泛型类型。
profiler api倒是官方的,但是这个一般是调试场景使用,可以监视所有对象的创建。那显然是可以找到所有运行时对象和其类型的。不过这个方案很麻烦,并且肯定严重影响性能。
如何获取运行时所有已加载类型?
引用 8 楼 github_22161131 的回复:

又找了找,从.net的TypeSpec这个元数据表里面取是可以找到静态定义的泛型类型。比如代码里用到的List<int>这种。不过这肯定要使用第三方工具,比如cecil或者dnlib,来直接解析元数据。但是这样仍然不可能获得Type.MakeGenericType动态构造的具体泛型类型。
profiler api倒是官方的,但是这个一般是调试场景使用,可以监视所有对象的创建。那显然是可以找到所有运行时对象和其类型的。不过这个方案很麻烦,并且肯定严重影响性能。

谢谢回复。是的,profiler api不是我想要的东西,我只是想找到所有的类型,监视每一个对象代价太大,看来还得继续找找看。

如何获取运行时所有已加载类型?
引用 7 楼 sbwwkmyd 的回复:
Quote: 引用 4 楼 github_22161131 的回复:

你说的“已加载”是什么概念?没有具体的说明那只能认为是appdomain加载的所有assembly里面的类型。
就是使用AppDomain.CurrentDomain.GetAssemblies()获得所有已加载的assembly,然后从这些assembly上GetTypes

assembly.GetTypes()仅仅是类型定义而已,我要的是运行时JIT创建的具体类型。
fieldset>

引用 5 楼 lovelj2012 的回复:

msdn有答案
http://msdn.microsoft.com/zh-cn/library/b8ytshk6(v=vs.110).aspx

如果你还不明白,就不要回了,谢谢。
fieldset>

引用 6 楼 github_22161131 的回复:

csdn的缓存刷新的够慢的…
貌似除了profiler api那种东西,是无法查找所有运行时创建的具体泛型类型的。还是根据具体需求,想想别的办法吧。

谢谢,就是想要类似的API,希望不是第三方的。
span style=”color: #FF0000;”>List<T>,你不是要知道运行的时候T的实际(String、Int32、或者是一个Class)类型么?


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明如何获取运行时所有已加载类型?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!