【问题标题】:How can I prevent Visual Studio from locking the xml documentation files in the bin directory?如何防止 Visual Studio 锁定 bin 目录中的 xml 文档文件?
【发布时间】:2009-07-22 19:25:41
【问题描述】:

我的 Visual Studio 解决方案包括一个 Web 应用程序和一个单元测试应用程序。我的网络应用程序使用 log4net。我希望能够从命令行使用 msbuild 来构建我的解决方案。但是,每当我从命令行构建解决方案时,都会出现构建错误,因为它无法将 log4net.xml 复制到测试项目的 bin 目录。

错误信息是:

“无法将文件 '\bin\log4net.xml' 复制到 'bin\Debug\log4net.xml'。访问路径 '\bin\log4net.xml' 被拒绝。”

看起来 Visual Studio 正在锁定此文件,但我不知道为什么需要这样做。有没有办法防止 VS 锁定它已经加载的项目中的 XML 文档文件?

【问题讨论】:

    标签: msbuild locking xml-documentation


    【解决方案1】:

    我找到了以下解决方案: 在 VS postbuild 事件或 NAnt/MSbuild 脚本中执行 cmd 脚本

    handle.exe -p devenv [Path to the folder with locked files] > handles.txt
    
    FOR /F "skip=5 tokens=3,4 delims=: " %%i IN (handles.txt) DO handle -p %%i -c %%j -y
    

    handle.exe 可以在这里找到http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx

    脚本的第一行将 VS 锁定的文件的所有句柄转储到handles.txt 第二行从文件中读取句柄 ID 并终止句柄

    脚本执行后,文件可能会被删除/替换/移动等

    【讨论】:

    • 优秀的答案。就像一个魅力,让我编写我的构建脚本,就像 Visual Studio 的行为一样,而不是围绕一个行为不端的 VS 编写我的构建脚本。
    • 我使用的是 Handle 3.46,我不得不将 tokens=3,4 更改为 tokens=3,6。之后它工作得很好,谢谢。
    【解决方案2】:

    如果您可以在输出中完全省略 xml 和 pdb 文件,您可以在命令行上将 /p:AllowedReferenceRelatedFileExtensions=none 传递给 msbuild。

    (感谢相关回答https://stackoverflow.com/a/8757941/251011

    编辑:如果你的dll文件也有这个错误,我最近发现了一个环境变量解决方案:https://stackoverflow.com/a/23069603/251011

    【讨论】:

    • 还有:有点好笑的是,VS过了将近五年还是这样锁,我们还是不知道为什么
    【解决方案3】:

    我在使用 Visual Studio 时也遇到过这个问题。我们使用 NAnt 而不是 MSBuild,但问题是一样的。我能够通过修改构建文件以在复制 xml 文档时忽略失败来解决它。

    请注意,由于 xml 文件仍处于锁定状态,这实际上并不能解决原始问题,但这种解决方法对我们来说已经足够好了,因为我们的 xml 文档的实际内容不会经常更改。

    【讨论】:

      【解决方案4】:

      克里斯坦写道:

      您可以将此文件拖放到另一个目录中并从那里引用它,或者将使用它的代码放入库中并让其上的构建后事件将其复制到其 bin 目录然后引用。

      我们的 xml 文件锁定问题不在项目的 bin 目录中,而是在外部引用目录中。在有新版本可用的地方执行 TortoiseSVN->Update 时,我们点击了它。假设是因为 VS 正在使用该文件进行智能感知。

      对于那些由于 TortoiseSVN->Update 而遇到此锁定问题的人,我目前正在试验一个更新前挂钩,它会在更新之前删除有问题的文件(如果不需要更新,它们将被恢复),到目前为止,这似乎有效(这很奇怪),但我还没有彻底测试过它可以肯定地说。如果证明可靠,将更新此答案。

      希望 MS 在 VS 2010 中修复它。

      【讨论】:

      • 我也面临同样的问题。您的解决方法效果很好,但奇怪的是 TSVN acn 删除了文件,但没有覆盖它!?
      【解决方案5】:

      基本上不要将文件检入bin文件夹,这是个坏主意。

      您可以将此文件拖放到另一个目录中并从那里引用它,或者将使用它的代码放入库中并让其上的构建后事件将其复制到其 bin 目录然后引用。

      Msbuild 然后会为您将其复制到 webprojects bin 目录:)

      我们在将东西签入 bin 目录时遇到了这个确切的问题,除非您绝对必须 bin 目录,否则根本不应该签入或只在其中包含 .refresh 文件以避免此类锁定问题。

      回复晚了,抱歉:)

      【讨论】:

      • 最初的问题并未表明任何文件都已检入 bin 目录,只是在构建期间将它们复制到那里。话虽如此,我同意,一般来说,不应将文件检入项目的 bin 目录中。
      • 啊抱歉,我已经重新阅读了它,你是对的 :) 但是我发现你无法在这些类型的项目上使用 post 和 pre build 事件非常尴尬,最后我通过依赖目录解决了这个问题,msbuild 总是正确地复制程序集。
      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2021-06-19
      • 2020-12-26
      • 2011-06-28
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多