Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在命令行安装期间使用作为参数传递的值从wix自定义操作更新appsettings.json?_C#_.net Core_Wix_Installation_Custom Action - Fatal编程技术网

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>