C# 如何允许使用MSIX生成可编辑的.Net配置文件?

C# 如何允许使用MSIX生成可编辑的.Net配置文件?,c#,.net,windows,asp.net-core,msix,C#,.net,Windows,Asp.net Core,Msix,我试图帮助将.Net服务移植到更现代的.Net版本(可能是核心版本),并使用MSIX安装程序。应用程序有几个由编译器生成的配置文件(在源代码中是app.config,但编译后变成了*.exe.xml),它们被安装到程序文件中,紧挨着二进制文件和GUI助手应用程序,应用程序本身可以修改它们以更改服务行为(端口、ip、tls证书等) 不允许在C:\Program Files\WindowsApps\package\u名称下写入。不允许在C:\Program Files\WindowsApps\pac

我试图帮助将.Net服务移植到更现代的.Net版本(可能是核心版本),并使用MSIX安装程序。应用程序有几个由编译器生成的配置文件(在源代码中是app.config,但编译后变成了*.exe.xml),它们被安装到程序文件中,紧挨着二进制文件和GUI助手应用程序,应用程序本身可以修改它们以更改服务行为(端口、ip、tls证书等)

不允许在C:\Program Files\WindowsApps\package\u名称下写入。不允许在C:\Program Files\WindowsApps\package\u名称下写入

我面临的问题是,MSIX安装程序使其沙盒版本的程序文件无法写入()。这意味着无法配置此应用程序,因此我不仅要尝试弄清楚如何重新配置应用程序,还要弄清楚windows希望如何处理应用程序配置

目前,似乎有两种通用的方法可以做到这一点:

  • 将配置数据写入服务帐户的AppData/local文件夹
  • 尝试在另一个文件夹中模拟
    /etc/Myservice
    行为。(表示包含服务配置数据的本地系统范围目录)
  • 如果您建议#1,请回答以下附加问题:

  • 如何将应用程序配置文件移动到用户配置文件目录
  • 具有普通帐户的管理员如何使用上述GUI helper应用程序修改服务帐户的AppData文件夹中的配置文件?(他们是否需要启用对服务帐户的桌面访问、登录和运行GUI)
  • 如果你建议#2:

  • 您建议该目录存在于何处(特别是MSIX允许的位置)
  • 如何告诉.Net应用程序文件不在其旁边?我可以只使用AppData.CurrentDomain.SetData吗

  • 嗯,在系统帐户上运行的服务对所有用户都是一样的,因此我认为CommonApplicationData是存储其设置的更好文件夹,而不是appdata。您的服务和任何需要部署自定义配置文件的管理员都可以轻松访问此文件夹

    在AppData中,您应该只存储实际的用户文件(如特定用户在应用程序中执行的操作生成的文件或设置,因此不同用户的文件不同)

    现在,第二部分是您需要将代码配置为从自定义路径加载配置文件,而不是在EXE旁边查找它。我不是.NET专家,但在快速搜索后,我发现:

    部署应用程序定制的现代方法 我不清楚的是,您的客户如何使用GUI帮助工具自定义配置文件。这是否只是IT部门的人员用来生成配置文件的工具,然后他们会复制该文件并使用MSI/MST文件(或通过其他自定义部署方法)将其部署到最终用户机器上

    如果您的应用程序仅由IT人员部署,那么您可以尝试另一种更简单(而且更优雅)的解决方案,为其提供自定义配置文件,实际上不需要任何代码更改

    您仍然可以将配置文件保留在ProgramFiles中的EXE旁边,并指示部署应用程序的IT团队使用部署GUI助手生成的自定义配置文件。(请查看上面包含的链接,以获取示例-文章末尾有一个视频版本)

    注意:IT团队可以使用多个免费或付费工具来生成MSIX修改包


    当然,您的GUI助手工具仍然需要在允许的文件夹中生成自定义配置文件,因为它不能再在ProgramFiles下写入。因此,实际上,在这种情况下,您也需要修改一点代码。

    这与MSIX无关。应用程序的文件不应是可编辑的,无论它们存储在
    程序文件中还是存储在UWP应用程序的任何位置。自20世纪90年代以来,Windows通过使
    程序文件
    只读来强制执行这一点。在更高版本中,通过错误操作应用程序写入的尝试被重定向到其他文件夹。可编辑配置文件从不存储在应用程序的文件夹中,无论是
    程序文件
    还是存储UWP应用程序的任何位置。在所有情况下,应用程序都应将其可编辑数据存储在
    %APPDATA%
    %LOCALAPPDATA%
    下(对于通用设置),或
    %USERAPPDATA%
    下(对于用户特定数据)。可以检索实际的特殊文件夹路径,这意味着没有任何更改。无法通过覆盖其
    exe.config
    来配置任何应用程序。即使是那些自以为如此的应用程序,也会被操作系统本身重定向。由于您使用ASP.NET Core,您可以方便地将设置文件存储在任何需要的位置,并使其覆盖存储在应用程序旁边的设置。NET Core没有
    .config
    文件,它可以从多个提供程序(包括数据库、环境变量等)加载设置,这些设置存储在执行帐户可访问的任何路径中。现在,在
    CommonApplicationData
    中存储数据就像使用正确的路径一样简单。提供程序可以覆盖以前的设置,因此不需要进行任何转换或自定义needed@PanagiotisKanavos对于每个.Net版本,此配置争用都是由
    AppDomain
    API处理的吗?@LiamKelly这并不重要,因为您不应该首先尝试写入
    exe.config
    。此外,ASP.NET核心没有.config文件。您不需要修改任何内容,只需将额外设置保存在可写位置,并确保在要覆盖的提供程序之后加载它。给定默认值(appsettings.json、appsettings.{env}.json、evn变量、命令行),只需