如何在.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
相关产品推荐
相关产品推荐

