C# 如何不使用Assembly.Load锁定两个文件

C# 如何不使用Assembly.Load锁定两个文件,c#,C#,如果我复制一个文件 File.Copy(src, dst); 然后加载副本 var asm = Assembly.LoadFile(dst); 为什么我的进程会锁定这两个文件? 如果在加载dst之前删除src,然后将dst重新复制回src,则会得到所需的最终结果。但是删除和复制似乎有点不必要 File.Copy(src, dst); File.Delete(src); var asm = Assembly.LoadFrom(dst); File.Copy(dst, src); 是的,我正在

如果我复制一个文件

File.Copy(src, dst);
然后加载副本

var asm = Assembly.LoadFile(dst);
为什么我的进程会锁定这两个文件?

如果在加载dst之前删除src,然后将dst重新复制回src,则会得到所需的最终结果。但是删除和复制似乎有点不必要

File.Copy(src, dst);
File.Delete(src);
var asm = Assembly.LoadFrom(dst);
File.Copy(dst, src);
是的,我正在构建一个插件设计应用程序。是的,我可以使用带卷影副本的AppDomains(http://msdn.microsoft.com/en-us/library/ms404279.aspx). 是的,我必须管理我自己的类型缓存(因为就我的AppDomain而言,每个程序集加载将提供不同的类型)。但这些都不是我问题的答案


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

可能是源文件位于应用程序的程序集解析路径中,因此它会自动加载。尝试创建src
C:\Temp
或其他与应用程序文件夹无关的路径,然后查看是否发生了相同的情况。

我编辑了我的评论,但现在它与您的原始问题无关,我将标记我的答案并删除。。谢谢,简单的解释是src已经被您的进程加载了,这是插件的一个常见问题。再说一次,如果它真的被锁定了,那么删除它将无法工作。所以可能它没有锁上。哈哈,“是的,但它不是”?:)复制后的src仍然未锁定(手动验证并使用外部工具检查文件锁定)。调用Assembly.Load时src文件会锁定。路径实际上是相同的。我接受了你的建议,发现更多令人困惑和不重复的行为;移动它是有效的,但当它被放在应用程序文件夹中时,加载有时会失败。我目前正试图找出代码中一个可复制的问题。(这可能是答案,让我来进行故障排除)LoadFrom似乎没有同时锁定这两个,只有LoadFile。更新问题。此外,将文件从应用程序自己的目录中取出确实可以防止其被锁定。但是,请注意,直到Assembly.LoadFile(不是在应用程序启动时)才发生锁定。我仍然在给你答案,因为解决方案是将文件移动到另一个文件夹。