我该如何修复我的后构建事件中的MSB3073错误?

42

我正在开发一个项目,需要将通过构建解决方案生成的DLL文件从bin文件夹复制到另一个文件夹,这两个文件夹都位于我的C盘上。我编写了一个批处理文件,使用xcopy来完成此操作,你可以在此处查看:

xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"

现在,我已经尝试了许多版本的此文件,它位于:

C:\Users\scogan\Desktop\CopyFiles.bat

所以我的构建后事件命令行看起来像这样:

call C:\Users\scogan\Desktop\CopyFiles.bat

我已经单独在桌面上的两个文件夹中运行了这个批处理文件,它可以正常工作。我也尝试单独运行它和需要复制的文件一起运行,那也没问题。但是,当我尝试将其作为构建后事件运行时,就会得到以下输出:

1>  Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1>  File not found - Organizr.Services.dll
1>  0 File(s) copied
1>  0 File(s) copied
1>  File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.

我做了一些调查,发现错误代码4意味着"初始化错误发生。内存或磁盘空间不足,或您在命令行上输入了无效的驱动器名称或无效的语法."

我还查找了MSB3073是什么,但没有找到太多可以帮助我的信息。所以,我的问题是我做错了什么?绝对路径有问题吗?这里任何帮助都将不胜感激。

16个回答

34

尝试不同的项目属性后,我发现项目构建顺序是问题所在。生成我想要复制的文件的项目被构建为第二个,但运行批处理文件作为后置事件的项目被构建为第一个,因此我只需要将构建事件附加到第二个项目即可,一切都正常工作。感谢大家的帮助。


1
这对我解决了问题。添加了一个新模块,使用与具有后构建事件的模块相同的文件。我添加了新的依赖项,然后它又可以工作了。 - vasquez

18

在 AfterBuild 目标中,优先考虑使用 MsBuild 的 "Copy" 任务而非后期构建事件。

将此 Target 添加到您的项目文件中,并删除 PostBuildEvent。

<Target Name="AfterBuild">
    <Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*" 
          DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\" 
          OverwriteReadOnlyFiles="true" 
          SkipUnchangedFiles="false" />
</Target>

1
很好,我明天回到工作时会尝试一下。我只是感到困惑,因为这仅在这两个文件中无法正常工作。我已经在桌面上尝试了两个与项目无关的文件,并且作为后期构建事件可以正常工作。 - Sean Cogan
更好的方法是使用元数据指定文件,而不是硬编码的路径,例如:SourceFiles = "$(TargetPath)"。 - James Woolfenden
@Nick Carlson 这个要在哪里添加呢?你说的项目文件是指什么?像 MainWindow.xaml 吗? - Sean Cogan
其实,我已经弄清楚为什么我的后构建事件没有起作用了。我会将其发布为答案,但还是谢谢你的帮助。 - Sean Cogan
@SeanCogan <Target /> 是一个你可以附加到 .csproj 文件的 msbuild 元素。 - Nicodemeus
@NickCarlson 好的,谢谢。我会记住这个方法,但是对于这个问题,我已经找到了解决方案。 - Sean Cogan

12

就我而言,问题是由于在copy命令中使用'/'作为目录分隔符所导致的。必须使用反斜杠。


6

在我的情况下,我通过构建项目创建的dll仍然在后台使用中。我终止了应用程序,然后xcopy就像预期的那样正常工作了。


6

指定的错误与发布后事件相关。某种方式,VS工具无法将文件复制到目标文件夹中。这可能有很多原因。要检查确切的错误原因,请转到工具 > 选项 > 项目和解决方案 > 构建和运行,并将"MsBuild项目构建输出详细程度"更改为"诊断"。它会提供足够的信息来检测实际问题。


2
不一定。我刚刚运行了一个日志级别设置为诊断的构建,但是消息没有提供任何可操作的线索。 - David A. Gray

4

虽然有点晚了,但还是为那些日后需要的人分享我的经验:

我在 MS VS 2010 中也遇到了同样的问题。通过给包含空格的 post build copy 命令参数加上引号解决了这个问题!

项目属性 --> 配置属性 --> 生成事件 --> 后期生成事件 --> 命令行 中做如下修改:

copy $(ProjectDir)a\b\c $(OutputPath)

改为

copy "$(ProjectDir)a\b\c" "$(OutputPath)"


1

我通过以下方式解决了这个问题:

在Visual Studio中,我进入了项目 -> 项目依赖项

我选择了XXX.Test解决方案,并告诉它还依赖于XXX解决方案,以使XXX.Test解决方案中的post-build事件不会生成此错误(退出代码为4)。


1

在运行复制命令之前,如果您遇到了一些问题,您需要做以下几件事情:

  1. 以管理员身份打开解决方案并构建解决方案。
  2. 如果您遇到“0个文件已复制”等问题,请检查源和目标路径。可能您正在使用错误的路径。最好在“命令提示符”中运行相同的命令,以检查它是否正常工作。

1
如果在将“after build”放入正确的项目后问题仍然存在,请尝试使用“复制”而不是xcopy。这对我起了作用。

1
在导入的项目中,构建事件(在属性对话框中的“构建事件”下)存在一个未定义的环境变量。前往“控制面板\所有控制面板项\系统\高级系统设置”添加适当的环境变量,然后仅需重新启动VS2017即可解决错误。
此外,根据@Seans和其他关于多个项目竞争/争用的答案,在输出文件夹中创建一个临时文件夹,如下所示:

like so

选择生成所需输出的项目:

enter image description here

构建(不是重新构建/清理)是一个快速的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接