我的公司目前为所有客户构建单独的MSI,即使该应用程序全面100%相同(只有一个例外,app.config中的ID)。
我想告诉他们我们可以使用ClickOnce一次发布,只需为每个客户端的安装程序添加一个查询字符串参数。
示例: http://mysite.com/setup.exe?ID=1234-56-7890
我遇到的问题是上面的内容(“ID = 1234 ...”)没有传递给“myapplication.application”。相反的是,应用程序正在成功安装,并且它第一次运行激活上下文,但“ActivationUri”不包含任何查询字符串值。
有没有办法将查询字符串值 FROM INSTALLER URL 传递给应用程序的启动URL?如果是这样,怎么样?
答案 0 :(得分:3)
经过大量搜索(和讨论)后,答案很简单,当前版本的ClickOnce不会那样。安装程序首次运行时不会将URL传递给应用程序。
以下是我为解决方法所做的工作(效果很好)。
更改我的安装程序包,使所有必需的文件解压缩并松散(与使用CAB文件或将其嵌入安装程序中相关)。
制作一个ASP.NET应用程序(使用Routing for URL处理),侦听对“mysite.com/Installer/00123/Setup.exe”的请求
然后我劫持了请求(解析setup.exe以找到嵌入式URL,告诉安装程序在哪里找到其余文件......然后用请求URL替换“/ 00000 /”用户去了 - 在这种情况下“00123”。
您可以使用GUID代替使用5位数ID ...这取决于您。
此解决方案适用于我们的组织...我们目前有37个客户需要对其安装程序包进行独特的自定义,但我们只需要实际构建和发布 ONE 安装程序包,并只需使用上面的劫持方法。
此时我们有替换的占位符,以便为我们想要的客户端定制安装程序。
示例:在app.config文件中,我们有displayName =“{OrgName}”,它会被数据库中的一个值自动替换。
答案 1 :(得分:0)
对我来说,“http://mysite.com/ myapplication.application ?id = 1234-56-7890”似乎可以解决问题。
答案 2 :(得分:0)
我知道这已经过时了,但是我只想提供当前的解决方案。
要在ClickOnce应用程序中检索查询字符串参数:
private NameValueCollection GetQueryStringParameters()
{
NameValueCollection nameValueTable = new NameValueCollection();
if (ApplicationDeployment.IsNetworkDeployed)
{
string queryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
nameValueTable = HttpUtility.ParseQueryString(queryString);
}
return (nameValueTable);
}
var querystringParams = GetQueryStringParameters();
string param_value = querystringParams["param_name"];
using System.Collections.Specialized;
using System.Deployment.Application;
using System.Web;