C# 如何在命令行安装期间使用作为参数传递的值从wix自定义操作更新appsettings.json?
我目前正在从事一个项目,我正在为安装程序使用C# 如何在命令行安装期间使用作为参数传递的值从wix自定义操作更新appsettings.json?,c#,.net-core,wix,installation,custom-action,C#,.net Core,Wix,Installation,Custom Action,我目前正在从事一个项目,我正在为安装程序使用Wix。我的应用程序是使用.netcore开发的,并将appsettings.json作为配置文件 我想用命令行安装期间作为参数传递的值更新appsettings.json上的值 例如,我将值500传递给参数BUFFER.SIZE msiexec.exe /i c:\PathToMyMsi\MyMsi.msi BUFFER.SIZE="500" /L*vx c:\PathToMyLog.txt 为了实现这一点,我在Product.wxs中定义了pro
Wix
。我的应用程序是使用.netcore
开发的,并将appsettings.json
作为配置文件
我想用命令行安装期间作为参数传递的值更新appsettings.json上的值
例如,我将值500
传递给参数BUFFER.SIZE
msiexec.exe /i c:\PathToMyMsi\MyMsi.msi BUFFER.SIZE="500" /L*vx c:\PathToMyLog.txt
为了实现这一点,我在Product.wxs
中定义了property
和custom action
,如下所示
<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>
但是,我被困在这里,因为我无法读取自定义函数中的值。日志不包含以下字符串
"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 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>
此操作失败。您不能在延迟的自定义操作中使用会话[“BUFFER.SIZE”]
要将属性从MSI传递到延迟的自定义操作,需要使用另一个操作来设置值,然后使用稍微不同的机制在自定义操作中读取该值
在的wixtoolset页面上,您将看到它在属性描述中有一个特别的提及,指出了如何在延迟的自定义操作中获取上下文
关于第二个操作,需要注意的一点是,它的属性值必须与延迟的自定义操作的Id值完全匹配
<CustomAction Id="SetGetParsValues" Property="GetParsValues" Value="BUFFER.SIZE=[BUFFER.SIZE]" />
<InstallExecuteSequence>
<Custom Action="SetGetParsValues" Before="GetParsValues"><![CDATA[NOT Installed]]></Custom>
</InstallExecuteSequence>
然后,在自定义操作中,您可以通过将会话[“BUFFER.SIZE”]
更改为session.CustomActionData[“BUFFER.SIZE”]
了解[#FileId]
也很有用,它使用文件的Id值作为组件文件的安装位置进行计算。然后,通过将SetGetParsValues自定义操作中的值更新为Value=“BUFFER.SIZE=[BUFFER.SIZE];JsonFilePath=[#JsonFileId]”
,可以将两个值传递给自定义操作。我不能100%确定执行[#JsonFileId]
是否有效,因此您也可以在这之前设置一个属性值,并在自定义操作的值中使用属性值。确保为应该用作命令行参数的属性设置Secure=“yes”
属性。如果util:XmlFile
与JSON文件一起工作,我也会感到惊讶。@zett42我更喜欢通过自定义操作更新应用程序设置。您可以忽略util:XmlFile@zett42尝试安全=“是”,但运气不佳。可以为上述要求提供任何示例?$(var.BasePath)\appsettings.json
首先有一个代码>在它的结尾,我不知道这会做什么。其次,它看起来可能在构建时指向本地路径,而不是在运行时指向安装路径,因为您使用的是$(var.BasePath)而不是[INSTALLDIR]或类似的东西。您可以尝试使用/l*v log.txt
从命令行运行安装(安装或卸载),以获取安装或卸载的日志文件,查看其崩溃的位置。
<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>
<Property Id="APPLICATION.PATH" Secure="yes" Value="$(var.BasePath)\appsettings.json;"/>
<CustomAction Id="SetFilePathID"
Property="SetFilePath"
Value="APPLICATION.PATH=[APPLICATION.PATH]"
Return="check"/>
<CustomAction Id="SetGetParsValues" Property="GetParsValues" Value="BUFFER.SIZE=[BUFFER.SIZE]" />
<InstallExecuteSequence>
<Custom Action="SetGetParsValues" Before="GetParsValues"><![CDATA[NOT Installed]]></Custom>
</InstallExecuteSequence>