You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.csproj构建设置中修改程序集名称实现ClickOnce双版本共存

解决ClickOnce同时发布测试版和正式版并允许共存的问题

我来帮你搞定这个需求!要让测试版和正式版能同时安装,核心是让ClickOnce把它们识别为两个完全独立的应用,这就需要修改程序集名称和产品名称——而你完全可以在现有的MSBuild目标里通过传递自定义属性来实现,不用改动原项目的基础配置。

具体修改步骤

你只需要在Test和Live目标的<MSBuild>任务里,添加覆盖程序集名称、产品名称的属性参数即可。这些属性会在构建时临时替换原项目的配置,不会影响你的基础项目文件。

修改后的完整配置代码如下:

<PropertyGroup>
  <ProjLocation>$(ProjectDir)</ProjLocation>
  <ProjLocationReleaseDir>$(ProjLocation)\bin\Debug</ProjLocationReleaseDir>
  <ProjPublishLocation>$(ProjLocationReleaseDir)\app.publish</ProjPublishLocation>
  <DeploymentFolder>C:\MyProjects\Software\Publish\</DeploymentFolder>
</PropertyGroup>

<!-- Build settings for live version -->
<Target Name="Live" DependsOnTargets="Clean">
  <!-- 传递正式版的程序集名称、产品名称属性 -->
  <MSBuild 
    Projects="$(ProjLocation)\$(ProjectName).csproj" 
    Properties="$(DefaultBuildProperties);AssemblyName=$(ProjectName);ProductName=$(ProjectName);PublishProductName=$(ProjectName)" 
    Targets="Publish"/>
  <ItemGroup>
    <SetupFiles Include="$(ProjPublishLocation)\*.*"/>
    <UpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*"/>
  </ItemGroup>
  <Copy SourceFiles="@(SetupFiles)" DestinationFolder="$(DeploymentFolder)\Live\" />
  <Copy SourceFiles="@(UpdateFiles)" DestinationFolder="$(DeploymentFolder)\Live\Application Files\%(RecursiveDir)"/>
</Target>

<!-- Build settings for test version -->
<Target Name="Test" DependsOnTargets="Clean">
  <!-- 传递测试版的程序集名称、产品名称属性(添加Test后缀区分) -->
  <MSBuild 
    Projects="$(ProjLocation)\$(ProjectName).csproj" 
    Properties="$(DefaultBuildProperties);AssemblyName=$(ProjectName)Test;ProductName=$(ProjectName) Test;PublishProductName=$(ProjectName) Test" 
    Targets="Publish"/>
  <ItemGroup>
    <SetupFiles Include="$(ProjPublishLocation)\*.*"/>
    <UpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*"/>
  </ItemGroup>
  <Copy SourceFiles="@(SetupFiles)" DestinationFolder="$(DeploymentFolder)\Public Test\" />
  <Copy SourceFiles="@(UpdateFiles)" DestinationFolder="$(DeploymentFolder)\Public Test\Application Files\%(RecursiveDir)"/>
</Target>

关键属性说明

这里传递的几个属性是实现共存的核心:

  • AssemblyName:决定了程序集的文件名,ClickOnce会以此区分不同的应用程序,不同的AssemblyName会被视为完全独立的应用,允许同时安装。
  • ProductName:会显示在Windows的开始菜单、控制面板的“添加或删除程序”里,让用户能直观区分测试版和正式版。
  • PublishProductName:影响ClickOnce发布的文件夹结构和快捷方式名称,确保发布的文件不会互相覆盖。

测试验证

现在你可以运行以下命令分别发布两个版本:

  • 正式版:msbuild /target:Live
  • 测试版:msbuild /target:Test

发布完成后,尝试安装两个版本,你会发现它们会出现在开始菜单的不同位置,并且在控制面板里是两个独立的条目,完全可以同时运行和更新。

内容的提问来源于stack exchange,提问作者Jakob Busk Sørensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:04:55