使用visual studio安装程序在安装过程中更改app.configuration文件失败:无法加载文件或程序集’EntityFramework’

项目信息:我们正在创建一个安装程序项目,允许用户选择服务器名称和数据库名称。 安装主程序后,将创建相应的数据库。

安装程序项目:

  • 有一个带有两个文本框的附加UI屏幕,包含servername和databasename。
  • 将在安装时执行自定义操作,并将servername和databasename定义为自定义操作数据。

主要应用:

  • 安装程序类连接安装后事件。 该类将在安装期间自动执行。 自定义操作数据将作为参数传递给此类。
  • 安装后事件将触发一个方法:
    • 创建数据库
    • 获取app.config文件并调整connectionstring。

一切正常, 期望保存配置文件:我们收到此错误:

System.Configuration.ConfigurationErrorsException:创建> entityFramework的配置节处理程序时出错:无法加载文件或>程序集’EntityFramework,Version = 6.0.0.0,Culture = neutral,> PublicKeyToken = b77a5c561934e089′

很奇怪,在运行和调试主应用程序时,我们不会遇到entityframwork的任何错误。 此外,我们能够将代码作为unittest执行,因此只有在使用visual studio安装程序进行安装期间更改配置文件时才会出现此assembly问题

您可以在下面找到更改配置文件的代码。

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()); } } 

知道什么是原因以及如何解决它? 提前谢谢了。

– 更新 – 我们找到了工作的基础。

通过避免使用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"); 

如果您的MSI将Gll(或其依赖关系)安装到GAC,则问题是在安装的Commit阶段之前,GAC中实际上无法访问已安装的GAC程序集。 暂停名称“AfterInstall”,该事件实际上“接近安装结束”。 如果您将该自定义操作移动为提交自定义操作并且它可以正常运行,那就是问题所在。

一般来说,在应用程序的第一次运行中执行这些操作通常会更好 – 看它没有配置,然后执行创建,连接字符串等等。调试要简单得多; 在安装程序类中,您使用本地系统帐户(在每台计算机上安装)或非提升用户(在每个用户安装中)运行,这些可能会导致安全性等问题。除此之外,如果用户想要移动数据库,或服务器名称更改等,您可以再次运行一些配置。