17

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

错误信息是:

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

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

4

5 回答 5

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

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

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

于 2010-10-19T15:27:10.793 回答
2

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

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

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

于 2014-03-25T19:32:01.673 回答
1

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

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

于 2009-11-14T02:32:40.987 回答
1

克里斯坦写道:

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

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

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

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

于 2009-12-10T00:40:41.923 回答
0

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

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

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

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

回复有点晚了,不好意思:)

于 2009-11-12T11:44:07.963 回答