【问题标题】:How to extend user.config settings when building an MSI using Microsoft Visual Studio Installer Projects使用 Microsoft Visual Studio 安装程序项目构建 MSI 时如何扩展 user.config 设置
【发布时间】:2018-11-04 04:01:21
【问题描述】:

正如标题所示,我正在尝试将在我的主项目中创建的 user.config XML 文件扩展到我相邻的设置项目。我正在使用 Microsoft Visual Studio 2017 安装程序项目(link) 构建一个 MSI,并使用 Visual Studio 2017 创建一个简单的表单应用程序。

例如,这是我的两个项目-

在我的主要 Windows 窗体项目中,我有一个名为 testBool 的 bool 属性,默认设置为 false。

在我的表单中,我有一个按钮,它运行以下简单代码并将 testBool 的值设置为 true-

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;

namespace TestUserConfig
{

public partial class Form1 : Form
    {
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("testBool = " + Properties.Settings.Default.testBool.ToString());

        //setting the property to true
        Properties.Settings.Default.testBool = true;

        MessageBox.Show("Test Bool = " + Properties.Settings.Default.testBool.ToString());

        //save the 
        Properties.Settings.Default.Save();

        //location of the user.config file (reference to System.Configuration required)
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
        MessageBox.Show(config.FilePath);
    }
    }
}

这一切都按预期工作,并将 user.config 文件输出到以下路径- C:\Users\USERNAME\AppData\Local\Microsoft_Corporation\PROJECTNAME_umi0kjiiephephcroktxjbzai0nh\14.0.7208.5000\user.config

我遇到的问题是,当我构建我的 MSI 时,相同的代码没有像我预期的那样运行。事实上,MessageBox.Show 甚至没有运行,除了最后一行代码——“MessageBox.Show("Hello!!");”

我希望剩余的消息框至少输出一个空白的消息框窗口。

此外,在 MSI 构建目录 (c:\Program Files (x86)\install dir) 我看到一个名为“PROJECTNAME.dll.config”的文件,其中包含 testBool 的默认值。
如果我发布一次单击应用程序,则该应用程序可以正常工作。 我需要在我的设置项目中添加一些东西来完成这项工作吗?

我已经阅读了所有能找到的关于这个问题的帖子,但似乎找不到合适的答案。我真的不想在学习 WIX 上投入大量时间,但如果这是唯一的途径,我可能需要这样做。

【问题讨论】:

    标签: c# winforms visual-studio windows-installer settings


    【解决方案1】:

    这种方法有几个问题:

    1. 托管代码自定义操作的实例化方式与作为应用程序运行时不同。托管代码没有本机 Windows 安装程序支持,因此 Visual Studio 设置包括一个 C++ Dll 作为正在运行的安装程序和托管代码之间的垫片。这个 shim 通过反射加载和实例化您的托管代码,绕过配置设置的东西。这意味着您需要使用 Xml 解析来访问该文件。

    2. 尽管 Visual Studio 允许您这样做,但您不应该在 Visual Studio 自定义操作之外的设置中显示 UI。它破坏了静默安装、组策略部署,并且 Windows Installer 体系结构不准备在安装的那个阶段处理 UI。具体的消息问题是单元线程没有正确的 UI 线程。因此,您的消息框将无法正常工作。从您的代码中看不出您要做什么(因为它看起来像是一个只设置值并存储它的测试),但是如果您有一个带有按钮等的 Windows 窗体,它们也不会工作。

    如果您想在安装过程中从 UI 中获取值,请使用其他 UI 表单之一(例如 TextBoxes)并从那里获取值。然后可以在 CustomActionData 中将属性(默认名称,例如 EDITA1)传递到使用 Xml 类在文件中设置值的自定义操作中。另一方面,如果这是正在运行的应用程序使用的那种设置,那么让应用程序在第一次运行时执行它通常更合适。

    另一个潜在问题是访问:受限用户无法创建或更新 Program Files 中的文件,因此尝试更新设置文件可能会出现问题。因此,除非它们是只读的,否则我不会将设置存储在 Program Files 中。如果这是一个问题,只需在(例如)用户的应用程序数据文件夹(即 Visual Studio 安装项目的文件系统视图中的位置)中包含任何 Xml 配置文件。

    【讨论】:

    • 您好 PhilDW,感谢您的回复。真的,我只是想在应用程序安装后使用设置功能(右键单击项目并添加 string/bool/byte..etc )(在运行安装而不是安装之后)。用户配置 testBool 只是一个示例。出于某种原因,在 VS 2010 中重复上述步骤可以使用 VS 2010 中包含的本机设置。在 VS 2010 之后,它被删除并推到了 VS 市场。由于它在 2010 年运行并在 users %localappdata% 文件夹中创建了一个 user.config,因此他们具有完全访问权限,并且它是存储用户设置的好地方。
    • 我不应该在那里存储设置吗?我应该创建自己的文件来存储用户设置吗?
    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多