【问题标题】:why does my post-build xcopy always copy the previous version (or hang)?为什么我的构建后 xcopy 总是复制以前的版本(或挂起)?
【发布时间】:2014-04-07 20:25:19
【问题描述】:

我有一个创建 DLL 的解决方案和一个将它们复制到另一个解决方案使用它们的目标文件夹的构建后 xcopy。我注意到一切似乎都很好,但实际上 xcopy 总是复制以前的版本而不是新构建的版本。 这是案例A

更奇怪(但可能相关):当我切换到批处理文件执行 xcopy 时,构建挂起。 (B) 最后,如果我在批处理文件中使用简单的复制命令,则构建成功,但再次复制了错误的版本。 (C)

以下是拼图的部分:

案例A直接在后期构建中:

xcopy "$(ProjectDir)bin\Debug\PIC_TextBrowser.dll" "$(SolutionDir)..\ToolBox\ToolBox\bin\Debug\" /Y /I

案例 B,一个批处理文件 xcopy.bat 调用 从后期构建:

xcopy "PIC_TextBrowser.dll" "D:\P\C#13\ToolBox\ToolBox\ToolBox\bin\Debug\" /Y /I

案例 C,一个批处理文件 xcopy.bat 调用 从后期构建:

copy "PIC_TextBrowser.dll" "D:\P\C#13\ToolBox\ToolBox\ToolBox\bin\Debug\" /Y 

.csproj 文件中的目标如下所示:

  <Target Name="BuildPlugins">
    <CSC Sources="PI_base.cs;PIC_TextBrowser.cs" TargetType="library" OutputAssembly="$(OutputPath)PIC_TextBrowser.dll" EmitDebugInformation="true" />
  </Target>
  <Target Name="AfterBuild" DependsOnTargets="BuildPlugins">
  </Target>
  <PropertyGroup>
    <PostBuildEvent>call xcopy.bat
</PostBuildEvent>

看起来构建后事件并不像我想象的那样'post'。除了接受它之外,还有什么想法吗?

【问题讨论】:

  • 是因为目的地不能被覆盖(正如你所说的另一个解决方案消耗它们)?
  • 没有。消费程序没有运行,复制实际上发生了,但显然是在构建完成创建新版本之前。而且,是的,我已经尝试了两种构建选项(“成功时”和“创建输出后”左右;我使用的是德国版本)。当然,我总是可以构建两次,但是,嘿,这似乎不对,是吗?
  • 禁用反恶意软件或进行排除,然后重试。如果是 Avast,请卸载它。
  • 确实发生了,但不是新版本而是旧版本。反恶意软件怎么能做到这一点?当然这是关于正确或错误的时机..
  • 根据您的PATH,您的文件xcopy.batxcopy.exe 之间的名称冲突可能是个问题。重命名您的 .bat 文件并添加 echo 语句以查看发生了什么以及工作目录是什么。使用完整的文件路径来确保您的脚本确实复制了预期的文件。

标签: c# batch-file dll xcopy post-build-event


【解决方案1】:

这是 VS Express 2012 和 2013 中的一个错误。(请参阅下面的编辑)

好吧,你不相信,我也不相信,所以我们都相处得很好..

但你还能如何解释这些发现:

我编写了两个小工具来从构建的文件以及“postbuild”事件开始和结束的时间提取提取时间到毫秒。这是必要的,因为这种怪异发生在秒级以下。

这些工具基本上是一个衬里,一个要在批处理文件中使用的控制台应用程序 (timeMS),它的作用很简单:

    Console.WriteLine(DateTime.Now.ToString("HH:mm:ss:fff"));

还有一个 winforms 程序,它为每个放到它上面的文件做:

tb_fileData.Text += file +  "\t" +   
   File.GetLastWriteTime(file).ToString("HH:mm:ss:fff") + "\r\n";

到目前为止,出错的余地并不大。 (好吧,著名的遗言之一,我承认..)

然后我修改了在构建后调用的批处理文件,如下所示:

echo post-build starts > time.txt
timeMS.exe >> time.txt
xcopy "PIC_Clock.dll" "D:\P\C#13\ToolBox\ToolBox\ToolBox\bin\Debug\" /Y /I
echo post-build ends  >> time.txt
timeMS.exe >> time.txt

结果如下:

D:\P\C#13\ToolBox\PIClasses\PIClasses\bin\Debug\PIC_Clock.dll   17:25:56:132
D:\P\C#13\ToolBox\ToolBox\ToolBox\bin\Debug\PIC_Clock.dll       17:21:30:778

post-build starts 
17:25:55:929
post-build ends  
17:25:55:960

第一个文件是新构建的,在复制完成之前没有完成/发布到文件系统;所以当然,xcopy 总是复制旧版本,即第二行中的版本,几分钟前构建..

再次,我测试了大约十几次,使用两种设置:“成功构建后”和“当构建刷新项目输出时”(或任何英文版本的名称......)

所以要么是错误,要么是功能,但无论如何我认为我不太明白..

编辑

好的,可能真的不是一个错误;这对我有帮助:csproj 文件提供的possibilties 比构建事件的属性页面中的选项更多。在这里,您可以将 Target Name= 从“AfterBuild”更改为“AfterCompile”,瞧,现在新版本已被复制。嗯,这一切只有我一个人吗???

这就是 csproj 现在的样子:

  <Target Name="BuildPlugins">
    <CSC Sources="PIC_Clock.cs" TargetType="library" OutputAssembly="$(OutputPath)PIC_Clock.dll" EmitDebugInformation="true" />
  </Target>
  <Target Name="AfterCompile" DependsOnTargets="BuildPlugins">
  </Target>
  <PropertyGroup>
    <PostBuildEvent>x_copy.bat
</PostBuildEvent>

【讨论】:

    【解决方案2】:

    试试 Robocopy.exe source dest /S /Z /Log:LogFileName 它至少应该让您了解您可能在哪里遇到问题。

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多