Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使VisualStudio可靠地运行预构建/编译?_C#_Msbuild_Visual Studio 2013 - Fatal编程技术网

C# 如何使VisualStudio可靠地运行预构建/编译?

C# 如何使VisualStudio可靠地运行预构建/编译?,c#,msbuild,visual-studio-2013,C#,Msbuild,Visual Studio 2013,我在基于同一csproj文件使MSBuild和VisualStudio工作时遇到问题 我基本上是在尝试为数据库制作一个安装程序。数据库更改位于另一个目录中的xml文件中。我需要将这些输入程序,然后在运行时通过查询它们来选择要应用的 我的想法是有一个预构建/编译步骤,在我运行程序时,该步骤将压缩目录并将该zip文件作为资源。我也可以在发布脚本中编译资源,但这种方式似乎更好,因为它使调试应用程序更容易 我已将以下内容添加到csproj文件中 <Target Name="PreBuildStep

我在基于同一csproj文件使MSBuild和VisualStudio工作时遇到问题

我基本上是在尝试为数据库制作一个安装程序。数据库更改位于另一个目录中的xml文件中。我需要将这些输入程序,然后在运行时通过查询它们来选择要应用的

我的想法是有一个预构建/编译步骤,在我运行程序时,该步骤将压缩目录并将该zip文件作为资源。我也可以在发布脚本中编译资源,但这种方式似乎更好,因为它使调试应用程序更容易

我已将以下内容添加到csproj文件中

<Target Name="PreBuildStep">
    <ItemGroup>
        <Patches Include="..\..\Database\**\*" />
    </ItemGroup>
</Target>
<Target DependsOnTargets="PreBuildStep" Name="BeforeBuild" Inputs="@(Patches)" Outputs="Resources\database.zip">
    <Exec Command="7z.bat a Resources\database.zip ..\..\Database -tzip" />
</Target>

这在从MSBuild运行解决方案或项目时有效。增量构建参数(输入+输出)似乎也起作用-如果我修改输入,它会重新创建输出,如果我不修改,它不会。同样,如果我删除输出文件,它会重新创建它

我刚刚在路径上添加了一个批处理文件以获取7z.bat-所做的只是调用7zip命令行(7z.exe)

问题是VisualStudio似乎没有运行MSBuild,而且似乎不可能让它可靠地运行任何东西—我还尝试过重写构建的依赖项并使用预构建事件,所有这些行为都是相同的

基本上,它偶尔会工作,但如果我删除输出文件,然后点击F5(调试已在配置管理器中选中了build),甚至点击ctrl+shift+b进行构建,那么它就不会被重新创建。如果我做了一个重建或清理和建设,然后它的工作预期


有人知道如何让它工作吗?我应该报告的是VisualStudio中的一个bug吗?感觉VisualStudio不会调用MSBuild,除非它确定代码发生了一些更改。

VisualStudio使用一种称为“快速更新检查”的功能来确定是否必须重新生成项目。原因是优化。此过程比实际运行msbuild增量生成更快

要对特定项目禁用此功能,请将以下属性添加到项目文件中:

<PropertyGroup>
  <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>

真的

当您点击
F5
时,VS将在运行前检查是否生成。在您的场景中,VS无法正确地确定它,因为您正在使用定制的预构建步骤(但它应该在第一次运行时就正确地完成所有操作,对吗?)。如果某些内容发生了超出范围的更改,您可以始终使用“全部生成”选项。@Sinatr是的,看起来就是这样。我能理解他们为什么不使用过时的MSBuild定义——它们与源代码管理不太适合——如果您重新更新,那么通常未版本化的输出将比版本化的输入更新。看起来它基本上阻止了定制构建步骤在VS中正常工作。更进一步,似乎属性必须在项目文件本身中定义,而不是在导入的目标文件(VS2013 Express)中定义。我将其放置在for标记中,现在它似乎可以工作了(MSVS 2013)。