代码之家  ›  专栏  ›  技术社区  ›  Patrick angularsen

根据条件编译符号更改exe的名称

  •  9
  • Patrick angularsen  · 技术社区  · 14 年前

    您能否告诉Visual Studio根据是否设置了特定的条件编译符号来输出一个不同的exe文件名?

    4 回复  |  直到 9 年前
        1
  •  11
  •   Fredrik Mörk    14 年前

    如果将.csproj文件加载到文本编辑器中,则可以控制 AssemblyName 财产:

    <AssemblyName Condition="'$(Configuration)' == 'Debug'">WindowsFormsApplication9.Debug</AssemblyName>
    <AssemblyName Condition="'$(Configuration)' != 'Debug'">WindowsFormsApplication9</AssemblyName>
    

    请注意,这不仅更改了文件名,而且 程序集名称 ,这可能意味着如果有其他代码引用该程序集时会出现问题。

    我自己从来没有这样做过,所以我不能说这个主意是好是坏。

        2
  •  5
  •   Patrick angularsen    14 年前

    由于按照fredrik的建议定义assembly name标记的条件似乎会使Visual Studio变得古怪,因此可以稍后在csproj文件中更改程序集名称。使用 Choose element 类似于if语句,因此如果满足条件,则可以追加名称,如下所示。

    例如,从中获取子字符串 DefineConstants 在条件中,属性似乎不可能(根据 MSDN )使用“普通msbuild”,但可以定义自己的构建目标,并在使用 /p:Tag=value ( MSBuild command line reference )

      ...
      <Tag>true</Tag>
    </PropertyGroup>
    <Choose>
      <When Condition=" '$(Tag)' == 'true' ">
        <PropertyGroup>
          <AssemblyName>$(AssemblyName).TagDefined</AssemblyName>
        </PropertyGroup>
      </When>
    </Choose>
    <ItemGroup>
    ...
    
        3
  •  1
  •   Frederik Gheysels    14 年前

    您可以编辑csproj文件,它只是包含“tasks”的msbuild文件。 csproj文件中有一个称为“afterbuild”的部分。

    也许,您可以在其中添加一个命令,将您的exe文件重命名为您选择的文件名。
    (当然,您必须取消该部分的注释)。

    也许是这样:

    <Target Name="AfterBuild">
         <Copy SourceFiles="" DestinationFiles="" Condition="" />
         <Delete Files="" Condition="" />
    </Target>
    

    我还没有进一步研究过,但是您应该完成条件属性,这样您就可以检查是否定义了条件符号。

        4
  •  1
  •   Elmue    9 年前

    这里的答案都不适合我。

    它们要么产生错误,要么什么也不做。

    这里是我的解决方案,它在VS2005中工作,我想它也可以在较新的VS版本中工作。编辑文件*.csproj如下:

    <PropertyGroup>
      <PreBuildEvent>
      </PreBuildEvent>
      <PostBuildEvent>
        if $(PlatformTarget) == x86  move /y "$(TargetPath)" "$(TargetDir)$(ProjectName)_32.exe"
        if $(PlatformTarget) == x64  move /y "$(TargetPath)" "$(TargetDir)$(ProjectName)_64.exe"
      </PostBuildEvent>
    </PropertyGroup>
    

    结果是32位编译生成一个文件 ProjectName_32.exe 64位构建产生 ProjectName_64.exe .

    请注意奇怪的语法。在 if 条件和 x86 不能用引号括起来。

    此方法的缺点是,由于Visual Studio找不到它生成的exe,您无法再在调试器中启动它。这可以通过将“move”命令替换为“copy”命令来解决,但在这种情况下,您必须将exe复制到另一个目录,因为您肯定不想在同一个目录中使用同一个文件两次。

    这一切都是一团糟。您可以直接在项目设置中输入输出目录,这真是难以置信,但要做一些真正基本的事情,例如更改exe名称,您必须编写这样一个笨拙的脚本,它有难看的副作用。为微软感到羞耻!