Msbuild 如何防止Visual Studio锁定bin目录中的xml文档文件?

Msbuild 如何防止Visual Studio锁定bin目录中的xml文档文件?,msbuild,locking,xml-documentation,Msbuild,Locking,Xml Documentation,我的VisualStudio解决方案包括一个web应用程序和一个单元测试应用程序。我的web应用程序使用log4net。我希望能够从命令行使用msbuild来构建解决方案。但是,每当我从命令行构建解决方案时,都会出现构建错误,因为它无法将log4net.xml复制到测试项目的bin目录 错误消息是: 无法将文件“\bin\log4net.xml”复制到“bin\Debug\log4net.xml”。对路径“\bin\log4net.xml”的访问被拒绝 看起来VisualStudio正在锁定此文

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

错误消息是:

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


看起来VisualStudio正在锁定此文件,但我不明白为什么需要锁定。有没有办法防止VS锁定已加载项目中的XML文档文件?

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

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

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

我们有一个确切的问题,就是人们将东西签入bin目录,除非您必须这样做,否则bin目录要么根本不应该签入,要么只是在其中有.refresh文件,以避免此类锁定问题


回复有点晚,抱歉:)

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

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

Krystan写道:

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

我们的xml文件锁定问题不在projects-bin目录中,而是在外部引用目录中。我们在执行TortoiseSVN->Update(新版本可用)时遇到了它。假设这是因为VS正在将该文件用于intellisense

对于那些因为TortoiseSVN->Update而遇到这个锁定问题的人,我目前正在试验一个更新前钩子,它在更新之前删除有问题的文件(如果不需要更新,它们将被恢复),到目前为止,这似乎是可行的(这很奇怪),但我还没有对它进行充分的测试来确定。将更新此答案,如果它被证明是可靠的


希望微软能在VS 2010中修复它。

我找到了以下解决方案: 在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在此处可用

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


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

如果可以从输出中完全忽略xml和pdb文件,则可以在命令行上将
/p:allowedReferenceLatedFileExtensions=none
传递给msbuild

(感谢相关回答)


编辑:如果dll文件也有此错误,我最近发现了一个环境变量解决方案:

原始问题没有表明任何文件已签入bin目录,只是在生成过程中将它们复制到该目录中。话虽如此,我同意,一般来说,文件不应该签入项目的bin目录。啊,很抱歉,我读过了,你是对的:)但是我确实觉得很尴尬,你不能在这些类型的项目上使用后期和预构建事件,最后,我通过拥有一个依赖项目录和msbuild始终正确复制程序集,解决了这个问题。您的解决方案运行良好,但奇怪的是TSVN acn删除了该文件,却没有覆盖它!?回答得很好。工作起来很有魅力,让我可以编写构建脚本,就像Visual Studio正在运行一样,而不是围绕一个行为不端的问题编写构建脚本,而我使用的是Handle 3.46,我必须将
tokens=3,4
更改为
tokens=3,6
。在那之后,它工作得很好,谢谢。另外:有一点有趣的是,在将近五年之后VS仍然像这样锁着,我们仍然不知道为什么。