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

时间:2009-11-18 07:59:56

标签: c# .net deployment clickonce

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

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

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

我认为我还应该澄清两个部署位置彼此不同,位于不同的服务器上。

更新

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

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

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

8 个答案:

答案 0 :(得分:26)

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

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

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

然而,我们发现两个“跑步者”项目的解决方案远比简单得多。我建议你先试试。

答案 1 :(得分:13)

ClickOnce: Concurrent versions 解释了如何执行此操作。

答案 2 :(得分: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不会更新此项。它仅在加载解决方案时生效,因此请确保切换调试/释放然后关闭并重新打开解决方案。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

Peter Mortensen的两个项目方案的变体。我想要开发人员,客户测试和客户发布。就我而言,我希望客户测试提供一些视觉线索,表明它是经过测试的,而不是实时的(例如标题中的“ TEST”和其他视觉主题)。

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

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

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

答案 7 :(得分:0)

在至少一次将项目配置为发布“单击一次”应用程序之后,您必须手动编辑csproj。

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

要复制的属性为ApplicationRevision(仅在需要单独的修订计数器的情况下),PublishUrlProductNameSuiteName(需要最后两个才能区分目标计算机上的配置)。您还必须覆盖AssemblyName属性(不能从第一组中将其删除)。

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

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

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