c# - 如何使用命令行安装期间作为参数传递的值从 wix 自定义操作更新 appsettings.json?

标签 c# .net-core wix installation custom-action

我目前正在一个项目中使用 Wix对于安装程序。我的应用程序是使用 .net core 开发的并拥有 appsettings.json作为配置文件。

我想更新 appsettings.json 上的值使用在 command-line installation 期间作为参数传递的值

例如,我正在传递值 500通过参数BUFFER.SIZE

msiexec.exe /i c:\PathToMyMsi\MyMsi.msi BUFFER.SIZE="500" /L*vx c:\PathToMyLog.txt

为了实现这一点,我定义了 propertycustom actionProduct.wxs如下
 <Property Id="BUFFER.SIZE" />

 <Binary Id="GetParameters.CA" SourceFile="..\..\Installer\CustomActions\bin\$(var.Configuration)\CustomActions.CA.dll" />
 <CustomAction Id="GetParValues" 
   BinaryKey="GetParameters.CA" 
   DllEntry="ConfigureBufferSize" 
   Execute="deferred" 
   Return="asyncWait" 
   Impersonate="no" />
 <InstallExecuteSequence>
    <Custom Action="GetParValues" After="InstallFiles"><![CDATA[NOT Installed]]></Custom>
</InstallExecuteSequence>

这是我的自定义操作
    [CustomAction]
    public static ActionResult ConfigureBufferSize(Session session)
    {
        try
        {
            session.Log("Begin ConfigureBufferSize");

            string size = "size = "+ session["BUFFER.SIZE"];
            session.Log(size); // I do not see any log like "size = 50"

            session.Log("End ConfigureBufferSize");
            return ActionResult.Success;
        }
        catch (Exception e)
        {
            return ActionResult.Failure;
        }           
    }

但是,我被困在这里,因为我无法读取自定义函数中的值。日志不包含以下字符串
  "size = 500"

但是,我在日志中看到的值如下。
   MSI (c) (D0:54) [10:47:06:515]: Command Line: BUFFER.SIZE=500 
   CURRENTDIRECTORY=50 CLIENTUILEVEL=0 CLIENTPROCESSID=17360 
   MSI (s) (84:DC) [10:47:19:361]: PROPERTY CHANGE: Adding BUFFER.SIZE property. Its value is '500'.
   Property(C): BUFFER.SIZE = 500

如何在自定义操作中读取这些值并更新 appsettings.json
我尝试使用 Component如下但它没有执行安装后
  <Component Id="config" Guid="*">
    <File Id="appconfig" Source="$(var.BasePath)\appsettings.json" KeyPath="yes" Vital="yes"/>
    <util:XmlFile
      Id="_pathFormat_" File="$(var.BasePath)\appsettings.json"
      Action="setValue"
      Name="pathFormat" Value="[BUFFER.SIZE]"
      ElementPath="/ApplicationLog/BufferSize"
      Sequence='1' />
  </Component>

使困惑!​​!

更新

这就是我能够在自定义操作中获取传递值的方式

申报属性(property)
  <Property Id="BUFFER.SIZE"  Secure="yes"/>

定义二进制
   <Binary Id="CustomActionDLL" SourceFile="..\..\Installer\CustomActions\CustomActions\bin\$(var.Configuration)\CustomActions.CA.dll" />

定义自定义操作
 <CustomAction Id="SetGetParsValues"
              Property="GetParsValues"
              Value="BUFFER.SIZE=[BUFFER.SIZE]"/>
<CustomAction Id="GetParsValues"
              BinaryKey="CustomActionDLL"
              DllEntry="ConfigureBufferSize"
              Execute="deferred"
              Return="check"
              Impersonate="no" /> 

设置安装顺序
  <InstallExecuteSequence>
    <Custom Action="GetParsValues" After="InstallFiles"><![CDATA[NOT Installed]]></Custom>
    <Custom Action="SetGetParsValues" Before="GetParsValues"><![CDATA[NOT Installed]]></Custom>
</InstallExecuteSequence>

现在,我可以在日志中看到传递的参数。

但是,当我尝试通过 json 时文件路径,失败
     <Property Id="APPLICATION.PATH"  Secure="yes" Value="$(var.BasePath)\appsettings.json;"/>


 <CustomAction Id="SetFilePathID"
              Property="SetFilePath"
              Value="APPLICATION.PATH=[APPLICATION.PATH]"
              Return="check"/>

这失败了。

最佳答案

您不能使用 session["BUFFER.SIZE"]在延迟的自定义操作中。

要将属性从 MSI 传递到延迟自定义操作,您需要使用另一个操作来设置值,然后使用稍微不同的机制在自定义操作中读取该值。

custom action 的 wixtoolset 页面上你会看到它在属性描述中特别提到了 this microsoft article它讨论了如何在延迟的自定义操作中获取上下文。

关于第二个操作需要注意的重要一点是,它的属性值必须与延迟的自定义操作的 Id 值完全匹配。

<CustomAction Id="SetGetParsValues" Property="GetParsValues" Value="BUFFER.SIZE=[BUFFER.SIZE]" />

<InstallExecuteSequence>
    <Custom Action="SetGetParsValues" Before="GetParsValues"><![CDATA[NOT Installed]]></Custom>
</InstallExecuteSequence>

然后在您的自定义操作中,您可以通过更改您的 session["BUFFER.SIZE"] 来访问该值。成为 session.CustomActionData["BUFFER.SIZE"]
了解 [#FileId] 也可能对您有用它使用文件的 Id 值被评估为组件文件的安装位置。然后,您可以通过将 SetGetParsValues 自定义操作中的值更新为 Value="BUFFER.SIZE=[BUFFER.SIZE];JsonFilePath=[#JsonFileId]" 来将两个值传递给您的自定义操作。 .我不是 100% 确定这样做 [#JsonFileId]将在那里工作,因此您也可以在此之前设置一个属性值并在自定义操作的值中使用该属性值。

关于c# - 如何使用命令行安装期间作为参数传递的值从 wix 自定义操作更新 appsettings.json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57294132/

相关文章:

C#。缩短标识符名称是否会提高应用程序的整体运行时性能?

c# - 类使用泛型和泛型类型参数时如何获取正确的MethodInfo对象

database - 在设置项目中管理 Entity Framework 代码优先迁移

wix - 使 WiX Bootstrapper 可用于使用 .NET 4.0 进行引导

c# - 在实体值更新期间读取值?

c# - 如何类型转换Tinyint(1) MySQL EF Core

.net - 如何禁用自动 .NET Core 包还原?

c# - 尝试发布到Azure容器注册表时获取 “Running the docker.exe login command failed.”

asp.net-core - 带asp.net核心的Windows身份验证

wix - 获取生成的 ProductCode 作为 Wix 中的变量