我希望能够为我的应用程序提供测试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
两者如何区分?似乎安装程序将它们视为两个单独的程序,因为我得到了每个程序的安装确认。虽然,当我安装第二个时,“添加/删除程序”只看到后者,虽然前者仍在磁盘上,因为我以后再重新安装它,它只是简单地运行,但随后添加/删除程序切换回到以前的名字。
它可能听起来有点蹩脚,但最简单的方法是在您的解决方案中有两个EXE项目。每个这些的Main
方法只会在原始的EXE项目中调用Main
方法(您将刚刚切换为DLL文件)。
这意味着每个EXE项目都可以拥有自己的ClickOnce发布设置,以及自己的app.config
文件。这意味着您有生产和测试版本的不同连接字符串。
您的另一个选择(可能看起来最有意义的选项)是使用MageUI.exe手动构建ClickOnce文件,这样您就可以选择不同的配置文件并在每次运行该工具时发布位置。还有一个命令行版本(Mage.exe),所以你可以理论上自动化这个。
但是,我们发现两个“跑步者”项目的解决方案要简单得多。我建议你先尝试一下。
ClickOnce: Concurrent versions解释了如何做到这一点。
我手动编辑了.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不会更新此项。它仅在加载解决方案时生效,因此请确保切换调试/释放然后关闭并重新打开解决方案。
请参阅有关并发版本控制的简洁视频:ClickOnce: Concurrent versions。
尝试在属性窗口的“应用程序”选项卡中更改“程序集名称”。
在至少配置一次项目以发布Click Once应用程序之后,您必须手动编辑csproj。
将一些Click Once相关属性从<PropertyGroup>
移动到<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
属性组,并在<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
属性组下复制它们。
要复制的属性是ApplicationRevision
(仅当您需要单独的修订计数器时),PublishUrl
,ProductName
和SuiteName
(最后两个要求能够区分目标计算机上的配置)。您还必须覆盖AssemblyName
属性(不从第一组中删除它)。
如果您希望能够在任何配置下调试项目,则还必须在覆盖StartAction
属性的每个组中添加StartProgram
和AssemblyName
属性。
在给予这些属性足够(即不同)的值之后,您将能够发布这两种配置,而无需修改项目,只需选择所需的配置即可。但是请注意,您必须在发布之间为不同的配置卸载项目,否则Visual Studio会搞乱您的参数。
之后,您还可以在同一台目标计算机上安装这两个版本。
我一直这样做。我的应用程序中甚至有一个屏幕可以更改特定用户将获得的版本。而且我在应用程序方面没有做任何棘手的事情,所有的魔力都在托管ClickOnce文件的Web服务器上。
看看我的好友写的文章,Fine Grained Versioning with ClickOnce。它解释了我们是如何做到的。
Peter Mortensen的两个项目场景的变化。我想要开发,客户测试和客户发布。在我的情况下,我希望客户测试提供一些视觉线索,它是测试,而不是现场(例如标题中的“TEST”和不同的视觉主题)。
我发现最简单的有两个解决方案以及两个存根项目。每个项目都在自己的目录中,有自己的存根program.cs,app.config和assemblyinfo.cs。
在开发/测试解决方案中,调试配置适用于dev,发布配置用于客户测试。我使用SlowCheetah来转换后者的app.config。
在客户发布解决方案中,我只需要一个发布配置。