gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:51:22 28 4
gpt4 key购买 nike

我目前正在一个项目中使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com