如何使用Assembly.Load避免锁定两个文件

3

如果我复制一个文件

File.Copy(src, dst);

然后加载副本

var asm = Assembly.LoadFile(dst);

为什么我的进程锁定了两个文件?

如果在加载目标文件之前删除源文件,然后将目标文件重新复制回源文件,我就可以得到想要的结果。但是删除和复制似乎有点多余。

File.Copy(src, dst);
File.Delete(src);
var asm = Assembly.LoadFrom(dst);
File.Copy(dst, src);

是的,我正在构建一个插件设计应用程序。是的,我可以使用AppDomains和Shadow Copy(http://msdn.microsoft.com/en-us/library/ms404279.aspx)。是的,我将不得不管理自己的类型缓存(因为每个程序集加载都会在我的AppDomain中提供不同的类型)。但这些并不是我的问题的答案。

注意,src和dst都是字符串。没有其他流打开文件。


我编辑了我的评论,但现在它与你的原始问题无关。我也会标记我的答案以供删除...谢谢Payo。 - MethodMan
简单的解释是,src 已经被您的进程加载了,这是插件常见的错误。但如果它真的被锁定了,那么删除它是行不通的。所以也许它并没有被锁定。 - Hans Passant
哈哈,“是但不是”? :) 在复制后的源代码中仍未锁定(已手动验证并使用外部工具检查文件锁定)。当调用Assembly.Load时,源文件会被锁定。 - payo
1个回答

2

可能是源文件在您的应用程序的装配解析路径中,因此会自动加载。尝试将src设置为C:\Temp或其他与应用程序文件夹无关的路径,看看是否发生相同的情况。


路径实际上是相同的。我采纳了你的建议并发现了更加混乱和不重复的行为;将其移动确实起到了作用,但是当它留在应用程序文件夹中时,有时会导致加载失败。我目前正在尝试找出代码中可重现的问题。(这可能就是答案,让我来排除故障) - payo
看起来 LoadFrom 没有锁定两个,只有 LoadFile。更新问题。此外,将文件从应用程序自己的目录中取出确实可以防止它被锁定。但请注意,直到 Assembly.LoadFile 执行时才会发生锁定,而不是在应用程序启动时。我仍然给你答案,因为解决方案是将文件移动到另一个文件夹中。 - payo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接