项目信息:我们正在创建一个安装程序项目,允许用户选择服务器名和数据库名。主程序安装完成后,将创建一个相应的数据库。
安装项目:
- 有一个额外的UI屏幕,有两个文本框,包含服务器名和数据库名。
- 自定义操作将在安装时执行,并将服务器名和数据库名定义为自定义操作数据。
主要用途:
- 安装程序类连接安装后事件。这个类将在安装期间自动执行。自定义动作数据将作为参数传递给该类。
- 安装后事件将触发一个方法:
- 创建数据库
- 获取app.config文件并调整connectionstring
一切正常除了保存配置文件:我们收到这个错误:
System.Configuration。ConfigurationErrorsException:为entityFramework创建配置部分处理程序时发生错误:无法加载文件或>程序集' entityFramework, Version=6.0.0.0, Culture=neutral,>PublicKeyToken=b77a5c561934e089'
很奇怪,在运行和调试主应用程序时,我们没有得到entityframework的任何错误。此外,我们能够以unittest的形式执行代码,因此只有在使用visual studio installer
安装期间更改配置文件时,才会出现这个汇编问题。您可以在下面找到更改配置文件的代码。
void DeployInstaller_AfterInstall(object sender, InstallEventArgs e)
{
try
{
Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
string connectionsection = config.ConnectionStrings.ConnectionStrings
["XBSDbDataContext"].ConnectionString;
ConnectionStringSettings connectionstring = null;
if (connectionsection != null)
{
config.ConnectionStrings.ConnectionStrings.Remove("XBSDbDataContext");
}
connectionstring = new ConnectionStringSettings("XBSDbDataContext", connectionString);
config.ConnectionStrings.ConnectionStrings.Add(connectionstring);
config.Save(ConfigurationSaveMode.Minimal, true);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
你知道可能是什么原因和如何解决它吗?提前感谢。
—UPDATE—我们找到了一个解决方法
避免使用ConfigurationManager类来编辑配置文件我们不再有这个问题。现在可以使用system.xml完成此操作名称空间。
//updating config file
XmlDocument XmlDoc = new XmlDocument();
MessageBox.Show(Assembly.GetExecutingAssembly().Location + ".config");
XmlDoc.Load(Assembly.GetExecutingAssembly().Location+".config");
foreach (XmlElement xElement in XmlDoc.DocumentElement)
{
if (xElement.Name == "connectionStrings")
{
xElement.LastChild.Attributes["connectionString"].Value = connectionString;
}
}
XmlDoc.Save(Assembly.GetExecutingAssembly().Location + ".config");
如果该Dll(或它的依赖项)正在由您的MSI安装到GAC,问题是安装的GAC程序集在安装的提交阶段之前实际上无法在GAC中访问。尽管名称为"AfterInstall",但该事件实际上是"接近安装结束"。如果你把那个自定义动作移到Commit自定义动作并且它能工作,那就是问题所在。
一般来说,在应用程序的第一次运行时做这些事情通常效果更好-看到它没有配置,然后做创建,连接字符串等。它的调试要简单得多;在安装程序类中,您使用本地系统帐户(在每台机器安装中)或非提升用户(在每用户安装中)运行,这可能会导致安全性等问题。除此之外,如果用户想要移动数据库,或者服务器名称更改等,您可以再次运行一些配置。