【问题标题】:Inno Setup Modify app.config file when you run setup.exeInno Setup 运行 setup.exe 时修改 app.config 文件
【发布时间】:2013-03-25 14:47:08
【问题描述】:

我有一个作为 Windows 服务托管的 WCF 服务。我一般去VS命令提示符,使用installutil.exe安装服务,然后根据我要安装的机器名修改app.config中服务的基地址,运行服务。

基地址是这样的:

<endpoint address="http://MACHINE_NAME/NFCReader/" binding="webHttpBinding"/>

我在 app.config 文件中修改了 MACHINE_NAME。

我想使用 inno setup 为我做同样的事情。

我想要的是当用户运行 setup.exe 文件来安装服务时,我想提示用户输入服务的基地址并使用该地址来托管它。我无法弄清楚是否有可能或如何做到这一点。

有什么帮助吗?提前致谢。 :)

【问题讨论】:

    标签: .net wcf web-services c#-4.0 inno-setup


    【解决方案1】:

    只是我用来在我的应用配置中替换字符串的示例。
    我相信它可以做得更好:-)

    我替换的是:

    添加 key="AppVersion" value="YYMMDD.HH.MM"

    [Code]
    procedure Update;
    var
    C: AnsiString;
    CU: String;
    begin
            LoadStringFromFile(ExpandConstant('{src}\CdpDownloader.exe_base.config'), C);
            CU := C;
            StringChange(CU, 'YYMMDD.HH.MM', GetDateTimeString('yymmdd/hh:nn', '.', '.'));
            C := CU;
            SaveStringToFile(ExpandConstant('{src}\Config\CdpDownloader.exe.config'), C, False);          
    end;
    
    function InitializeSetup: Boolean;
    begin
      Update;
    result := True;
    end;
    

    【讨论】:

    • 是的,例如使用 XML 解析器。如果您熟悉 MSXML,可以关注this post。将其扩展到您的需求非常简单。 InnoSetup 的快速 XML 解析器在我的任务列表中(但需要一些时间)。
    • 如果您在模板文件中有一个可以替换的已知唯一标记字符串(类似于上面的代码),那么 XML 解析器/写入器是不必要的复杂化。但是,如果您需要能够修改无法注入此类标记的文件(例如,如果您需要更新已安装在用户系统上的文件),这是一个好主意。但是请注意,上面的代码有一个错误:DateTime 被视为 ISPP 值而不是代码函数。应该直接调用它,而不是通过ExpandConstant
    • 已更正。感谢您的提示。
    • @RobeN 感谢您的回答。它对我有用。但我的脚本几乎不需要更改,即我必须通过使用密钥来更改值(这里你使用了密钥本身)。有什么办法吗?如果不是,那么我对这个答案很满意。
    【解决方案2】:

    我建议您使用 XML 解析器来更新您的配置文件。以下功能可以帮助您。它使用 MSXML 作为文件解析器:

    [Code]
    const
      ConfigEndpointPath = '//configuration/system.serviceModel/client/endpoint';
    
    function ChangeEndpointAddress(const FileName, Address: string): Boolean;
    var
      XMLNode: Variant;
      XMLDocument: Variant;  
    begin
      Result := False;
      XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0');
      try
        XMLDocument.async := False;
        XMLDocument.preserveWhiteSpace := True;
        XMLDocument.load(FileName);    
        if (XMLDocument.parseError.errorCode <> 0) then
          RaiseException(XMLDocument.parseError.reason)
        else
        begin
          XMLDocument.setProperty('SelectionLanguage', 'XPath');
          XMLNode := XMLDocument.selectSingleNode(ConfigEndpointPath);
          XMLNode.setAttribute('address', Address);
          XMLDocument.save(FileName);
          Result := True;
        end;
      except
        MsgBox('An error occured during processing application ' +
          'config file!' + #13#10 + GetExceptionMessage, mbError, MB_OK);
      end;
    end;
    

    【讨论】:

    • 我可以帮你解决剩下的需求(安装开始前创建一个输入页面,让用户输入端点地址,安装成功后调用上述函数),如果你需要.让我知道...
    • 进展如何?任何反馈将不胜感激;-)
    猜你喜欢
    • 2012-03-05
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多