首页 新闻 搜索 专区 学院

CLR为什么不允许卸载单个程序集?

0
悬赏园豆:30 [已解决问题] 解决于 2014-07-11 10:38

3个问题:

1.CLR只能通过AppDomain间接卸载Assembly,为什么不允许卸载单个Assembly?

2.const修饰的常量被保存在内存的什么位置,生命周期怎样?能否详细描述一下生命周期的过程?

3.如果1个类包括static成员,当该类的1个实例被GC回收以后,该static成员引用的内存是否会被释放?如果局部变量被声明为static或const,当方法调用栈结束以后,该变量是否会被释放?

 

以上问题困扰多时,特向园子里的大牛们请教!

卡米i的主页 卡米i | 初学一级 | 园豆:161
提问于:2014-07-10 16:44
< >
分享
最佳答案
0

1.为了元数据追踪粒度不要太小.之前拜读过,说是以程序集级别管理程序集也是可以实现的,只是微软的人觉得得不偿失,

2.const就是一个常量,内存的什么位置还真不知道.net应该是有自己的一套东西,但是常量是在程序集被加载时就有的,这个是肯定的,生命周期应该是与程序集一起的,程序集又是被域管理的,所以常量生命周期应该是从程序集加载,到域被卸载

3.static 静态成员属于类,而不属于对象,局部变量肯定只在当前作用域内有效,都不一定能坚持到调用栈被释放

收获园豆:30
吴瑞祥 | 高人七级 |园豆:28891 | 2014-07-10 18:00

第1个,有描述相对清楚一点的参考资料么?

第2个,有道理!

第3个,似乎类的static成员生命周期也和const一致?

我在想,既然static修饰变量的作用就是在到静态存储区分配内存,照此推理,static局部变量应该也是在static区,即使方法调用结束,这块内存依然没有被释放啊,有些困惑。

卡米i | 园豆:161 (初学一级) | 2014-07-10 19:02

@卡米i: 1.百度下吧,应该能找到一个讲解的东西

2.静态变量和常量有着本质区别,常量不可修改,是编译时就非配好的内存空间的,静态变量是在第一次调用时,调用类的静态构造函数进行初始化的.

3.静态局部变量还真挺复杂 

http://zhidao.baidu.com/link?url=pM0fXjsHQwZU_pSBBZn0_ya1GXQorrhvk4eIiySz0_mW5dH0ID130RVbwrYxYjsbfXVD1bn2qKHB5kVS-l-dca

吴瑞祥 | 园豆:28891 (高人七级) | 2014-07-11 09:14

@吴瑞祥: 谢谢!

BTW,非常赞同你对第2个问题的分析思路!对const我原以为内存中某一块特殊区域做了限制,一经写入无法更改,后来想想觉得这不科学,MS总不会为了一个const关键字而单独实现一种机制去管理这片特殊内存区域吧。

const编译时即已确定而非运行时,假如真像我猜测的那样,const和static就不应该出现在局部变量里,有什么意义呢?既然没意义,为什么C#没有限制呢,到目前为止我还没想到有什么样的应用场景会去这样做。

 

谢谢你的回复~!

卡米i | 园豆:161 (初学一级) | 2014-07-11 10:37
其他回答(1)
0

第一个问题没看懂,能否用代码演示下。

Launcher | 园豆:45045 (高人七级) | 2014-07-10 17:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册