积极答复者
Application.GetResourceStream 怎么回事? 有关文件锁定

问题
-
StreamResourceInfo streamInfo = Application.GetResourceStream(new Uri("UIOnly;component/Images/my_work.png", UriKind.Relative));
if ((streamInfo != null) && (streamInfo.Stream != null)){using (var stream = streamInfo.Stream){
}}
uionly.dll是独立的一个文件, 跟主程序没有别的关联, 执行完上面的代码后, uionly.dll就被锁定了, 删除不了, 这是为什么呢??我可是啥都没干啊...
答案
-
首先,这个资源是在一个程序集里的。运行时如果不把程序集载入内存,你是无法取得这个资源的;其次,程序集要载入,那么需要进入当前AppDomain, 而当前AppDomain就会锁住这个程序集。
这个是CLR运行时的规则,很容易看到。你运行一个程序时,你是不能移动和剪切这个程序正在使用的dll文件的。
Best day, Best life- 已标记为答案 Jie BaoModerator 2011年1月17日 2:08
- 取消答案标记 Jie BaoModerator 2011年1月17日 2:08
- 已建议为答案 Sheldon _XiaoModerator 2011年1月17日 9:22
- 已标记为答案 Jie BaoModerator 2011年1月20日 2:42
-
因为这个文件被Appdomain载入了,你只有释放AppDomain才可以解锁。
Best day, Best life- 已建议为答案 Sheldon _XiaoModerator 2011年1月11日 6:17
- 已标记为答案 Sheldon _XiaoModerator 2011年1月14日 13:13
- 取消答案标记 Sheldon _XiaoModerator 2011年1月16日 4:40
- 已标记为答案 Jie BaoModerator 2011年1月20日 2:42
全部回复
-
因为这个文件被Appdomain载入了,你只有释放AppDomain才可以解锁。
Best day, Best life- 已建议为答案 Sheldon _XiaoModerator 2011年1月11日 6:17
- 已标记为答案 Sheldon _XiaoModerator 2011年1月14日 13:13
- 取消答案标记 Sheldon _XiaoModerator 2011年1月16日 4:40
- 已标记为答案 Jie BaoModerator 2011年1月20日 2:42
-
你好 永乐,
我觉得Jarrey已经给你一个解决方案, 我将把你的帖子标记为已解答,这样有利于和你有一样问题的 论坛的其他成员 通过你的帖子找到问题的解决方案或者方向。
如果你觉得这个答案对你没有任何帮助,你也可以取消标记为答案,并且告诉我们你现在存在的疑惑, 我们将尽量为你解决问题。
Best regards,
Sheldon _Xiao [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
-
首先,这个资源是在一个程序集里的。运行时如果不把程序集载入内存,你是无法取得这个资源的;其次,程序集要载入,那么需要进入当前AppDomain, 而当前AppDomain就会锁住这个程序集。
这个是CLR运行时的规则,很容易看到。你运行一个程序时,你是不能移动和剪切这个程序正在使用的dll文件的。
Best day, Best life- 已标记为答案 Jie BaoModerator 2011年1月17日 2:08
- 取消答案标记 Jie BaoModerator 2011年1月17日 2:08
- 已建议为答案 Sheldon _XiaoModerator 2011年1月17日 9:22
- 已标记为答案 Jie BaoModerator 2011年1月20日 2:42
-
还是不明白, 想取得资源可以把程序集当普通文件载入内存进行解析, 为什么非得当成一个程序载入?
这个当然也是可行的了,如果你熟悉PE文件格式,能够使用代码去解析PE文件,这里也就是你的包含资源的DLL文件,你就可以当作一般的文件读入内存,进行解析,取得里面的资源。否则,最简单的就是当作程序集加载进入你的当前AppDimain然后取得里面的资源。
关于PE有很多内容,特别是.Net程序集的PE,是比较特殊的,你可以参考这些:
- http://en.wikipedia.org/wiki/Portable_Executable
- http://www.codeproject.com/KB/dotnet/asmex.aspx 这个文章介绍了如何做一个.Net assembly PE 查看器
J
Best day, Best life -