我需要在app.config中创建一个地址字符串:
<client>
<endpoint address="http://ServerName/xxx/yyy.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IClientIInfoService"
contract="DocuHealthLinkSvcRef.IClientIInfoService" name="BasicHttpBinding_IClientIInfoService" />
</client>
安装期间用户需要输入ServerName
。
为此,我在安装程序中创建了一个新的UI对话框。我还撰写了Installer.cs
课程并将install ()
改为:
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string targetDirectory = Context.Parameters["targetdir"];
string ServerName = Context.Parameters["ServerName"];
System.Diagnostics.Debugger.Break();
string exePath = string.Format("{0}myapp.exe", targetDirectory);
Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);
config.AppSettings.Settings["ServerName"].Value = ServerName;
config.Save();
}
}
但是如何在ServerName
中使用此app.config
来创建指定的字符串。
我正在研究VS2010。
答案 0 :(得分:5)
您可以使用WiX (Windows Installer XML toolset)来构建MSI,在这种情况下,您可以使用XmlFile实用程序标记来更新服务器名称:
<util:XmlFile Id="UpdateServerName" File="[INSTALLLOCATION]AppName.exe.config" Action="setValue" ElementPath="/client/endpoint" Name="address" Value="http://[SERVERNAME]/xxx/yyy.svc" />
您可以使用WixUI扩展程序表单在安装期间捕获服务器名称。
WiX的优点:WiX符合msbuild(与.vdproj文件不同),并且可以对您的安装程序进行更精细的控制,among other things
答案 1 :(得分:3)
假设您正在app.config
中使用完整的ServiceModel部分组基本上,您按照以下步骤操作:
保存配置
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string targetDirectory = Context.Parameters["targetdir"];
string ServerName = Context.Parameters["ServerName"];
System.Diagnostics.Debugger.Break();
string exePath = string.Format("{0}myapp.exe", targetDirectory);
Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);
config.AppSettings.Settings["ServerName"].Value = ServerName;
//Get ServiceModelSectionGroup from config
ServiceModelSectionGroup group = ServiceModelSectionGroup.GetSectionGroup (config);
//get the client section
ClientSection clientSection = group.Client;
//get the first endpoint
ChannelEndpointElement channelEndpointElement = clientSection.Endpoints[0];
//get the address attribute and replace servername in the string.
string address = channelEndpointElement.Address.ToString().Replace("ServerName", ServerName);
//set the Address attribute to the new value
channelEndpointElement.Address = new Uri(address);
config.Save();
}
答案 2 :(得分:2)
在一天结束时,app.config
为xml
个文件。您可以使用Linq To XML或XPathNavigator替换address
元素的endpoint
属性。
以下代码使用Linq to Xml
using System.Xml.Linq;
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string targetDirectory = Context.Parameters["targetdir"];
string ServerName = Context.Parameters["ServerName"];
System.Diagnostics.Debugger.Break();
string configPath = string.Format("{0myapp.exe.config", targetDirectory);
XElement root = XElement.Load(configPath);
var endPointElements = root.Descendants("endpoint");
foreach(var element in endPointElements)
{
element.Attribute("address").Value = ServerName;
}
root.Save(configPath);
}
}
答案 3 :(得分:2)
由于你有一个windows-installer标签,我假设你有一个MSI包,或者可以创建一个......
然后:
可以使用以下方式进行静默安装:
msiexec /i app.msi ENDPOINTSERVER=www.MyServer.com /qb-
答案 4 :(得分:2)
在保存配置文件更改之前尝试使用以下两行:
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("Section Name");
root.Save(configPath);
P.S:如果你用F5运行它,它不会更新解决方案项'app.config',而是更新bin /文件夹中的'.exe.config'。