【问题标题】:Debugging file handle issues in c#/.NET在 c#/.NET 中调试文件句柄问题
【发布时间】:2012-01-19 22:25:37
【问题描述】:

我有一个程序反过来访问 DLL。它以各种方式使用文件,创建、复制它们并将它们建立为 emailMessage 对象的附件。我有一个“正在使用的文件”错误,阻止了文件的覆盖。

是否有任何工具或技术可以简化流程 - 例如,对包含特定字符串的句柄的创建/删除发出某种警告?我查看了进程资源管理器、进程监视器(filemon 的继任者)等,但没有运气。

我可以继续寻找,但认为可能有比继续通过代码进行非正式调查更好的方法。

编辑

感谢 cmets。关于问题,结构有点复杂。我有我的“客户端”应用程序,它引用了一个“引擎”dll(也在 C# 中)。两个都是我自己的。客户端创建“附件”实例,每个附件都包含对各种文件的文件引用。它的构造函数获取引用的文件,并将副本放在临时文件夹中。稍后,一组“操作”构建电子邮件 - 它将每个附件作为“真实”附件添加到 EmailMessage 对象。在不同的时间,我处理对象并将它们的引用设置为 null,但如果我做得太早,那么我最终会遇到 null 引用异常。如果我做得太晚,那该死的东西正在使用中!我确信我可以在适当的时候找到这个特定的错误,但它让我想知道是否有一个有用的标准方法可供知情人士使用。 :)

【问题讨论】:

  • 我的第一个想法是推荐 Process Explorer,但我看到您已经尝试过了。运气不好,嗯?
  • 文件句柄(Filestream 等)的创建完全在您的应用程序中,还是还涉及外部进程?
  • 文件使用错误。您是否有权访问调用/创建文件的代码。?如果是这样,它可能没有被正确发布,或者如果它是 C# 代码,文件流的更新不正确也可能导致这种情况。你有创建文件/附件的代码示例吗?这个 DLL 托管代码还是非托管代码..??
  • 作为对附加信息的回复 - 我认为保存对文件的“引用”的标准方法是作为文件名传递而无需担心生命​​周期问题。让您的附件对象保存文件的文件名,而不是流,然后该对象根本不需要是一次性的。
  • 您好。我确实这样做了,但是当您开始创建附件并将其添加到 EmailMessage 的附件集合时,它会变得有点混乱。如果您添加它,然后取消引用,它往往也会在电子邮件消息中破坏它。我必须承认我不是引用类型如何工作的专家,所以我需要对每个引用类型的指向进行更多调查。谢谢

标签: c# .net debugging visual-studio-debugging filehandle


【解决方案1】:

Procmon 会告诉你谁(即哪个进程)正在打开文件,以及打开它的位置的(非托管)堆栈。

在 C#/.NET 中出现此问题的通常原因是人们打开文件流并且在完成处理后没有进行处理。这意味着文件会一直保持打开状态,直到(至少)下一次垃圾回收,这可能需要很长时间。

【讨论】:

  • IDisposable 和使用块摇滚。
  • 谢谢。我同意;但必须保留一些对象足够长的时间才能将它们附加到电子邮件中(请参阅我上面的编辑)
【解决方案2】:

听起来您正在寻找一种工具来让您知道在调试时锁定文件的原因。如果是这样,您可以使用Unlocker 来确定锁定文件的进程。

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多