我有一个Visual Studio安装程序,用于安装托管Web服务的Windows服务。
我想要解决的是在安装过程中为用户提供一个特定脚本位于框中的选择,一旦他们设置了位置,然后将位置更新到app.config文件,应用程序就可以了使用
在安装过程中,我添加了一个自定义文件夹,并将该文件夹添加到该文件夹中。这一切都已安装。我希望将其保留为默认值,但是能够使用用户的新选项覆盖它。
我添加了一个用户界面和一个文本框来捕获用户的选择和一个安装程序类,但是当我尝试它时失败了。它失败的地方是它试图找到我的App.Config文件。它说它找不到它。在我的代码中,我写道:
string path = Assembly.GetExecutingAssembly().Location;
所以,对我来说,当安装在那个时刻运行时,我的app.config还没有安装到这个位置。
那么,有人可以建议我如何覆盖并保存新位置。
由于
答案 0 :(得分:0)
你所做的事情由于多种原因而无法工作。
VS安装项目中的自定义操作在安装完所有文件后运行,因此选择可安装文件的文件夹为时已晚。 UI应该位于正常向导UI表单运行的前端,但VS设置不支持自定义对话框。
具有UI的安装程序类往往会做一些奇怪的事情,因为它们是从MSI中的执行序列调用的,并且公寓线程不起作用。
您未在交互式用户环境中运行。正在使用系统上下文运行的msiexec进程调用安装程序类。如果需要加载文件,请明确命名路径。
如果您要坚持使用Visual Studio设置,最好的办法是将脚本安装到正常的默认位置,并让您的应用程序提供将其复制到某处的方法。然后,用户可以随时将其复制到新的位置,并且您可以在普通用户环境中运行。
答案 1 :(得分:0)
您 无法 获取使用MSI安装目录的完整路径,
string path = Assembly.GetExecutingAssembly().Location;
上面的代码可能会返回一个路径C:\Windows\System32
,它具有处理MSI安装的msiexec.exe位置。在安装程序类中使用以下代码来获取安装路径。
string installationPath = Context.Parameters["assemblypath"];
您的其他问题不明确。
答案 2 :(得分:0)
民间
管理自己解决这个问题。
我在Installer类中添加了一个afterinstall事件。在这种情况下,我添加了这行代码
string assembley = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(assembley);
string path = Uri.UnescapeDataString(uri.Path);
string directory = Path.GetDirectoryName(path);
要获取配置文件 - 我这样做了
Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetAssembly(typeof(ProjectInstaller)).Location);
这给了我想要的东西,它有效