我正在开发一个安装项目。在一个单独的库项目中,我通过继承System.Configuration.Install.Installer创建了一个自定义安装程序,并将生成的.dll添加为自定义操作。(安装步骤)。我将一个app.config文件添加到库项目中,在那里我存储了一个连接字符串,我需要连接到Sql Server。
运行安装项目后,自定义安装程序不会检索存储在app.config文件中的connectionString。
我在哪里可以存储连接字符串?安装项目可以有app.config吗?有人可以推荐一本关于部署/设置项目的书吗?
由于
更新
您好, 谢谢。根据回复,我更新了我的代码,这就是我现在正在做的事情:
- >在安装项目中,我在安装步骤中添加了自定义操作,选择了应用程序文件夹和主输出(库项目)。 - >向库项目添加了app.config,并将其构建操作设置为“content”。 - >将库项目内容文件添加到安装项目中。
这样app.config文件就会出现在安装文件夹中。
在我的自定义安装类的安装处理程序中,我执行以下操作:(在这种情况下,我访问应用程序设置)
string appPath = "";
appPath = Path.Combine(new DirectoryInfo(Context.Parameters["assemblypath"].ToString()).Parent.FullName, "App.config");
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = appPath;
System.Configuration.Configuration c = null;
c = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
string result = c.AppSettings.Settings["test"].Value;
答案 0 :(得分:4)
如果你坚持这样做,你仍然可以重用app.config,但是你需要用自己的方式来解析它。
以下是此解决方法的必要步骤:
在“设置项目”中,在“应用程序文件夹”中添加“项目输出”,然后选择“内容文件” 而不是主要输出。您可以 验证app.config是输出 通过调用上下文菜单并选择 来自的内容文件的输出 ......项目。
完成此操作后,您应该从Custom Installer类库项目获得2个输出(1个用于主输出,1个用于内容文件)。
以下是一个示例自定义安装程序操作,该操作将启动我的appSettings键中的所有内容,名为launch以及替换的ConfigurationManager实现:
using System;
using System.Configuration.Install;
using System.Xml;
using System.IO;
using System.Reflection;
using System.ComponentModel;
using System.Collections;
namespace ClassLibrary1
{
[RunInstaller(true)]
public partial class Installer1 : System.Configuration.Install.Installer
{
public Installer1()
{
InitializeComponent();
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
System.Diagnostics.Process.Start(ConfigurationManager.AppSettings["launch"]);
}
}
public class ConfigurationManager
{
private static AppSetting _appSettings = new AppSetting();
public static AppSetting AppSettings
{
get { return _appSettings; }
}
public class AppSetting
{
public string this[string key]
{
get
{
var path = Path.Combine(Path.GetDirectoryName(Assembly.GetCallingAssembly().Location), "app.config");
var xpath = string.Format("/configuration/appSettings/add[@key='{0}']", key);
var doc = new XmlDocument();
doc.Load(path);
var node = doc.SelectSingleNode(xpath);
if (node == null)
return string.Empty;
return node.Attributes["value"].Value;
}
}
}
}
}
答案 1 :(得分:1)
我建议您不要尝试解析app.config
,而是将configSource
属性添加到app.config
以外部化连接字符串,例如:
<connectionStrings configSource="connections.config" />
然后获取安装脚本以生成整个connections.config
文件,类似于:
<connectionStrings>
<clear />
<add name="...." connectionString="...." providerName="...." />
</connectionStrings>
请确保使用.config
作为文件的扩展名,以便在有人猜到文件名时无法将其提供给浏览器。