【问题标题】:How do I fix MSB3073 error in my post-build event?如何修复构建后事件中的 MSB3073 错误?
【发布时间】:2013-06-09 03:25:31
【问题描述】:

我正在处理一个项目,该项目要求将通过构建我的解决方案生成的 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 是什么,并没有真正找到可以帮助我的东西。所以,我的问题是我做错了什么?绝对路径是否搞砸了?感谢您提供任何帮助。

【问题讨论】:

    标签: visual-studio-2012 msbuild post-build-event


    【解决方案1】:

    玩弄不同的项目属性,我发现项目构建顺序是问题所在。生成我要复制的文件的项目是第二构建的,但是作为构建后事件运行批处理文件的项目是首先构建的,所以我只是而是将构建事件附加到第二个项目,它工作得很好。不过,谢谢大家的帮助。

    【讨论】:

    • 这解决了我的问题。添加了一个新模块,该模块使用与构建后事件相同的文件。我添加了新的依赖项,它又可以工作了。
    【解决方案2】:

    优先考虑 AfterBuild 目标中的 MsBuild“复制”任务而不是构建后事件。

    将此目标附加到您的项目文件中并删除 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>
    

    【讨论】:

    • 太棒了,我明天回去工作时试试。我只是很难过,因为这仅不适用于这两个文件。我在桌面上尝试了两个与项目无关的文件,并且作为构建后事件运行良好。
    • 使用元数据而不是硬编码路径指定文件时会更好,例如SourceFiles="$(TargetPath)".
    • @Nick Carlson 我实际上在哪里附加这个?项目文件是什么意思?比如,MainWindow.xaml?
    • 实际上,我弄清楚了为什么我的构建后事件不起作用。我会将其发布为答案,但感谢您的帮助。
    • @SeanCogan 是一个 msbuild 元素,您可以附加到 .csproj 文件中。
    【解决方案3】:

    不管怎样,我的问题是在copy 命令中使用“/”作为目录分隔符引起的。必须使用反斜杠。

    【讨论】:

      【解决方案4】:

      就我而言,我通过构建项目创建的 dll 仍在后台使用。我杀死了应用程序,然后 xcopy 按预期正常工作。

      【讨论】:

      • 这是一个救生解决方案 :)
      【解决方案5】:

      指定的错误与构建后的事件有关。不知何故,VS 工具无法将文件复制到目标文件夹。可能有很多原因。要检查确切的错误原因,请转到 Tools > Option> Project and Solution > Built and run,并将“MsBuild project build output verbosity”更改为“Diagnostic”。它将为您提供足够的信息来检测实际问题。

      【讨论】:

      • 不一定。我刚刚运行了一个将日志记录设置为诊断的构建,这些消息没有提供任何可操作的线索。
      【解决方案6】:

      为时已晚,但将我的经验发布给稍后查看它的人:-

      在 MS VS 2010 中,我遇到了同样的问题。通过在包含空格的构建复制命令 args 中加上引号来解决它!

      Project Properties --&gt; Configuration Properties --&gt; Build Events --&gt; Post-Build Event --&gt; Command Line更改:

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

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

      【讨论】:

        【解决方案7】:

        如果即使将 after build 放入正确的项目后问题仍然存在,请尝试使用“copy”而不是 xcopy。这对我有用。

        【讨论】:

          【解决方案8】:

          导入项目的构建后事件(在属性对话框中的构建事件下)有一个未定义的环境变量。
          导航到Control Panel\All Control Panel Items\System\Advanced system settings 添加适当的environment variable, and doing no more 比重新启动VS2017 解决了错误。
          此外,继@Seans 和其他有关多个项目竞赛/争用的答案之后,在输出文件夹中创建一个临时文件夹,如下所示,

          并选择产生首选输出的项目:

          构建(无需重新构建/清理)是一种快速的解决方案。

          【讨论】:

            【解决方案9】:

            如果您遇到复制命令的问题,您应该在运行复制命令之前执行以下操作

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

            【讨论】:

              【解决方案10】:

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

              在 Visual Studio 中,我进入了 Project -&gt; Project Dependencies

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

              【讨论】:

                【解决方案11】:

                我的测试项目遇到了同样的问题。我发现了为什么我的构建后事件不起作用,那是因为我在运行 $(ProjectName).exe 命令之前复制了文件,并且其中一些文件是测试项目本身所必需的。因此,只需将 $(ProjectName).exe 作为第一个命令移动即可解决问题。

                【讨论】:

                  【解决方案12】:

                  我发现当您有多个项目并行构建并且一个或多个项目试图复制相同的文件时会出现此问题,从而产生会导致偶尔出现错误的竞争条件。那么如何解决呢?

                  有很多选择,如上所述,只是改变一些事情可以解决某些人的问题。更强大的解决方案是......

                  • 限制正在复制的文件,即用xcopy $(TargetDir)*.*"...代替xcopy "$(TargetDir)$(TargetName).*"...

                  • 捕获错误并重试,即:

                      :loop
                      xcopy /Y /R /S /J /Q  "$(TargetDir)$(TargetName).*" "somewhere"
                      if ErrorLevel 1 goto loop
                  
                  • 使用 robocopy 代替 xcopy

                  • 您可能不希望这样做,因为它会增加您的构建时间,但您可以将并行项目构建的最大数量减少到 1 ...

                  【讨论】:

                    【解决方案13】:

                    我最近遇到了这个问题,令人惊讶的是只有我遇到了这个问题,而我的团队成员在构建项目代码时都没有遇到这个问题。

                    在调试时发现我的代码目录有间距问题,它是 D:\GIT Workspace\abc\xyz。

                    作为快速修复,我将其更改为 D:\GITWS\abc\xyz 并解决了问题。

                    【讨论】:

                      【解决方案14】:

                      我从 Github 下载一些源代码后收到此错误。特别是氧化锈开发框架。我的问题是用于从 Steam 更新某些 dll 的 Steam.ps1 脚本文件被操作系统阻止。我不得不打开文件属性 UNBLOCK 它。我没有意识到这是对 ps1 文件和 exes 完成的。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-03-21
                        • 2020-11-17
                        • 2023-03-29
                        • 1970-01-01
                        • 2015-06-29
                        相关资源
                        最近更新 更多