Installation ClickOnce:如何通过安装程序*将查询字符串值传递给我的应用*?

Installation ClickOnce:如何通过安装程序*将查询字符串值传递给我的应用*?,installation,clickonce,query-string,Installation,Clickonce,Query String,我的公司目前为我们的所有客户构建单独的MSI,即使该应用程序在所有方面都是100%相同的(只有一个例外,app.config中有一个ID) 我想向他们展示,我们可以使用ClickOnce一次性发布,只需为每个客户端的安装程序添加一个查询字符串参数 示例: 我遇到的问题是,上面的(“ID=1234…”)没有传递给“myapplication.application”。相反,该应用程序正在成功安装,并且第一次使用激活上下文运行,但“ActivationUri”不包含任何查询字符串值 是否有方法将查询

我的公司目前为我们的所有客户构建单独的MSI,即使该应用程序在所有方面都是100%相同的(只有一个例外,app.config中有一个ID)

我想向他们展示,我们可以使用ClickOnce一次性发布,只需为每个客户端的安装程序添加一个查询字符串参数

示例:

我遇到的问题是,上面的(“ID=1234…”)没有传递给“myapplication.application”。相反,该应用程序正在成功安装,并且第一次使用激活上下文运行,但“ActivationUri”不包含任何查询字符串值

是否有方法将查询字符串值从安装程序URL传递到应用程序的启动URL?如果是这样的话,怎么做?

对我来说,“myapplication.application?id=1234-56-7890”似乎起到了作用。

经过大量搜索(和讨论),答案很简单,ClickOnce的当前版本不是这样工作的。安装程序在第一次运行时不会将URL传递到应用程序上

以下是我为解决问题所做的工作(效果非常好)。

  • 更改我的安装程序包,使所有必需的文件都未压缩和松散(与使用CAB文件或将其嵌入安装程序类似)

  • 制作一个ASP.NET应用程序(使用URL处理路由)侦听对“mysite.com/Installer/00123/Setup.exe”的请求

    • 注意:路由应该侦听“/Installer/{ID}/*”,其中{ID}是5位数字
    • 实际上没有名为“00123”的目录,而是使用ASP.NET路由来接收这些请求,然后将其映射到包含安装程序文件的实际目录
  • 然后我劫持该请求(解析setup.exe以找到嵌入式URL,该URL告诉安装程序在何处查找其余文件…然后我将“/00000/”替换为用户访问的请求URL,在本例中为“00123”

    • 由于每个文件都被请求,我知道要发送的文件的“版本”,因为ClickOnce安装程序将查找“mysite.com/Installer/00123/SomeFile.dll”(或其他任何内容)
您可以使用GUID,而不是使用5位数的ID…这取决于您

此解决方案对我们的组织非常有效……我们目前有37个客户需要对其安装程序包进行独特的自定义,但我们只需实际构建和发布一个安装程序包,并简单地使用上面的劫持方法

此时,我们交换了占位符,以便根据需要为任意多的客户端定制安装程序


示例:在app.config文件中,我们有displayName=“{OrgName}”,它被数据库中的一个值自动替换。

我知道这已经过时,但我只是想提供当前的解决方案

要在ClickOnce应用程序中检索查询字符串参数,请执行以下操作:

  • 将app/download/setup链接指向应用程序(扩展名为.application),而不是“setup.exe”
  • 将此函数添加到ClickOnce应用程序以检索querystring参数集合:
  • 然后,要获取querystring参数值:
  • 别忘了用法:

  • 来源:

    URL确实会发送到应用程序,但不会发送到安装程序。您对以下内容有何建议
    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;