【问题标题】:Visual Studio Installer with to set path of script file用于设置脚本文件路径的 Visual Studio 安装程序
【发布时间】:2014-10-10 16:12:52
【问题描述】:

我有一个 Visual Studio 安装程序,它安装一个托管 Web 服务的 Windows 服务。

我要解决的是在安装过程中让用户选择特定脚本在盒子上的位置,一旦他们设置了位置,然后将位置更新为应用程序可以的 app.config 文件使用。

在安装过程中,我添加了一个自定义文件夹并将文件添加到该文件夹​​中。这一切都已安装。我想将此保留为默认值,但能够用用户的新选择覆盖它。

我添加了一个用户界面和一个文本框来捕获用户的选择,以及一个安装程序类,但是当我尝试它时失败了。它失败的地方是它试图找到我的 App.Config 文件。它说它找不到它。在我的代码中,我写道:

    string path = Assembly.GetExecutingAssembly().Location;

所以,对我来说,当安装当时正在运行时,我的 app.config 还没有安装到这个位置。

那么,有人可以告诉我如何覆盖和保存新位置。

谢谢

【问题讨论】:

  • 如果找不到文件,您将使用什么类型的 else 条件您可以不将默认值分配给预期文件所在的已知位置..您可以显示一些代码..?还可以在Settings.setting 中存储一个默认位置吗?
  • 我的解决方案基于raquila.com/software/…
  • 不要发布到其他网站的链接,这是关闭帖子的好方法,请发布实际代码示例

标签: c# windows-installer


【解决方案1】:

由于多种原因,您正在做的事情不会奏效。

  1. VS 安装项目中的自定义操作在所有文件安装后运行,因此选择可以安装文件的文件夹为时已晚。 UI 应该位于运行正常向导 UI 表单的最前面,但 VS 设置不支持自定义对话框。

  2. 带有 UI 的安装程序类往往会做一些奇怪的事情,因为它们是从 MSI 中的执行序列中调用的,而单元线程将不起作用。

  3. 您没有在交互式用户环境中运行。您的安装程序类是从使用系统上下文运行的 msiexec 进程调用的。如果需要加载文件,请明确命名路径。

如果您要坚持使用 Visual Studio 设置,最好的办法是将脚本安装到正常的默认位置,并让您的应用程序提供一种将其复制到某处的方法。然后,用户可以随时将其复制到新的地方,并且您在正常的用户环境中运行。

【讨论】:

  • 感谢您的回复。您的答案可以追溯到我最初的安装方式。但是,我想再问你一个问题,因为我见过其他安装程序,它们为其他应用程序创建插件,例如 Outlook 等,它们有 app.config,并且这些工作。那么,你能解释一下为什么我的会有所不同吗?在您的第三点中,如果我想继续安装安装程序,如何让 msi 显式加载 app.config,您有示例吗?
  • 其中一些是 Visual Studio。它不具备其他安装程序所具备的功能,例如功能齐全的 WiX、InstallShield 等。您应该尝试将程序 exe 作为自定义操作运行,而不是安装程序类。这将从安装目录运行,可能会找到您的配置文件,您可以询问用户并将文件复制到新位置,但它仍在 SYSTEM 帐户下的安装程序上下文中运行。至于示例,您在谈论代码,而 exe 只是您运行的程序,来自安装程序类的代码。
  • 谢谢,但我已将安装程序类附加到自定义操作
【解决方案2】:

无法获取正在使用的安装 MSI 的目录完整路径,

string path = Assembly.GetExecutingAssembly().Location;

上面的代码可能会返回一个路径C:\Windows\System32,它具有处理MSI安装的msiexec.exe位置。在安装程序类中使用以下代码获取安装路径。

string installationPath = Context.Parameters["assemblypath"];

你的其他问题都不清楚。

【讨论】:

    【解决方案3】:

    乡亲

    设法自己解决了这个问题。

    我在 Installer 类中添加了一个安装后事件。在这个事件中,我添加了这行代码

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

    这给了我我想要的东西并且它有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多