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

时间:2009-07-22 19:25:41

标签: msbuild locking xml-documentation

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

错误消息是:

  

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

看起来Visual Studio正在锁定此文件,但我无法弄清楚它为什么需要。有没有办法阻止VS在已加载的项目中锁定XML文档文件?

5 个答案:

答案 0 :(得分:8)

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

可用

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

Krystan写道:

  

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

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

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

这里希望MS在VS 2010中修复它。

答案 4 :(得分:0)

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

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

然后,Msbuild将把它复制到webprojects bin目录中:)

我们有这个问题,人们检查bin目录中的内容,除非你绝对必须bin目录,或者根本不应该检入或只是在那里有.refresh文件,以避免这些类型的锁定问题。 / p>

回复迟到了,抱歉:)