如何同时部署两个ClickOnce版本?

问题描述 投票:33回答:8

我希望能够为我的应用程序提供测试ClickOnce服务器,用户可以并行运行生产版本和测试版本。这可能吗?

我首先尝试在AssemblyInfo.cs中使用以下内容,并在ClickOnce部署中更改名称,尽管所有这些都是用测试版本覆盖用户的生产版本。同样,它们在返回生产服务器时也是如此。

#if DEBUG
[assembly: AssemblyTitle("Product Name - Test")]
#else
[assembly: AssemblyTitle("Product Name")]
#endif

我想我还应该澄清两个部署位置彼此不同并且在不同的服务器上。

UPDATE

我也尝试根据调试模式设置清单的GUID,但它再次无法工作(下面使用虚拟GUID)。

#if DEBUG
[assembly: Guid("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA")]
#else
[assembly: Guid("BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB")]
#endif

两者如何区分?似乎安装程序将它们视为两个单独的程序,因为我得到了每个程序的安装确认。虽然,当我安装第二个时,“添加/删除程序”只看到后者,虽然前者仍在磁盘上,因为我以后再重新安装它,它只是简单地运行,但随后添加/删除程序切换回到以前的名字。

c# .net deployment clickonce
8个回答
26
投票

它可能听起来有点蹩脚,但最简单的方法是在您的解决方案中有两个EXE项目。每个这些的Main方法只会在原始的EXE项目中调用Main方法(您将刚刚切换为DLL文件)。

这意味着每个EXE项目都可以拥有自己的ClickOnce发布设置,以及自己的app.config文件。这意味着您有生产和测试版本的不同连接字符串。

您的另一个选择(可能看起来最有意义的选项)是使用MageUI.exe手动构建ClickOnce文件,这样您就可以选择不同的配置文件并在每次运行该工具时发布位置。还有一个命令行版本(Mage.exe),所以你可以理论上自动化这个。

但是,我们发现两个“跑步者”项目的解决方案要简单得多。我建议你先尝试一下。


14
投票

ClickOnce: Concurrent versions解释了如何做到这一点。


6
投票

我手动编辑了.csproj,为debug/release指定了不同的ProductName。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    ...
    <PublishUrl>publishbeta\</PublishUrl>
    <InstallUrl>http://www.softwareabc.com/download/beta/</InstallUrl>
    <ProductName>Software ABC Test</ProductName>
    <AssemblyName>SoftABCTest</AssemblyName>
    <ApplicationIcon>Resources\Test.ico</ApplicationIcon>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <PublishUrl>publish\</PublishUrl>
    <InstallUrl>http://www.softwareabc.com/download/</InstallUrl>
    <ProductName>Software ABC</ProductName>
    <AssemblyName>SoftABC</AssemblyName>
    <ApplicationIcon>Resources\Application.ico</ApplicationIcon>
</PropertyGroup>

需要注意的是,如果在调试/发布之间切换,Visual Studio 2010不会更新此项。它仅在加载解决方案时生效,因此请确保切换调试/释放然后关闭并重新打开解决方案。


2
投票

请参阅有关并发版本控制的简洁视频:ClickOnce: Concurrent versions


1
投票

尝试在属性窗口的“应用程序”选项卡中更改“程序集名称”。


1
投票

在至少配置一次项目以发布Click Once应用程序之后,您必须手动编辑csproj。

将一些Click Once相关属性从<PropertyGroup>移动到<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">属性组,并在<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">属性组下复制它们。

要复制的属性是ApplicationRevision(仅当您需要单独的修订计数器时),PublishUrlProductNameSuiteName(最后两个要求能够区分目标计算机上的配置)。您还必须覆盖AssemblyName属性(不从第一组中删除它)。

如果您希望能够在任何配置下调试项目,则还必须在覆盖StartAction属性的每个组中添加StartProgramAssemblyName属性。

在给予这些属性足够(即不同)的值之后,您将能够发布这两种配置,而无需修改项目,只需选择所需的配置即可。但是请注意,您必须在发布之间为不同的配置卸载项目,否则Visual Studio会搞乱您的参数。

之后,您还可以在同一台目标计算机上安装这两个版本。


0
投票

我一直这样做。我的应用程序中甚至有一个屏幕可以更改特定用户将获得的版本。而且我在应用程序方面没有做任何棘手的事情,所有的魔力都在托管ClickOnce文件的Web服务器上。

看看我的好友写的文章,Fine Grained Versioning with ClickOnce。它解释了我们是如何做到的。


0
投票

Peter Mortensen的两个项目场景的变化。我想要开发,客户测试和客户发布。在我的情况下,我希望客户测试提供一些视觉线索,它是测试,而不是现场(例如标题中的“TEST”和不同的视觉主题)。

我发现最简单的有两个解决方案以及两个存根项目。每个项目都在自己的目录中,有自己的存根program.cs,app.config和assemblyinfo.cs。

在开发/测试解决方案中,调试配置适用于dev,发布配置用于客户测试。我使用SlowCheetah来转换后者的app.config。

在客户发布解决方案中,我只需要一个发布配置。

© www.soinside.com 2019 - 2024. All rights reserved.