Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
WiX如何将数据导入/导出到C#自定义操作?_C#_Wix_Custom Action - Fatal编程技术网

WiX如何将数据导入/导出到C#自定义操作?

WiX如何将数据导入/导出到C#自定义操作?,c#,wix,custom-action,C#,Wix,Custom Action,我需要: 从用户(从UI)获取数据,并将该数据放入属性中 使用自定义操作将属性导入某些C#代码 对属性执行一些操作(加密值) 将值导出回WiX,我将在那里 创建注册表项并将加密值放入其中 我可以完成那张单子上的所有事情,除了第四张。也就是说,我似乎无法将和导出值导入C#代码。我认为问题在于时机 下面是一个用于将某些属性导入某些C#代码的自定义操作示例: 接下来,下面是一个如何将C#代码中的变量作为属性导出回WiX的示例: <Binary Id="Binary_CustomActionTem

我需要:

  • 从用户(从UI)获取数据,并将该数据放入属性中
  • 使用自定义操作将属性导入某些C#代码
  • 对属性执行一些操作(加密值)
  • 将值导出回WiX,我将在那里
  • 创建注册表项并将加密值放入其中
  • 我可以完成那张单子上的所有事情,除了第四张。也就是说,我似乎无法将导出值导入C#代码。我认为问题在于时机

    下面是一个用于将某些属性导入某些C#代码的自定义操作示例:

    接下来,下面是一个如何将C#代码中的变量作为属性导出回WiX的示例:

    <Binary Id="Binary_CustomActionTemplate" 
            SourceFile="$(var.CustomAction.TargetDir)CustomAction.CA.dll"/>
    
    <CustomAction Id="CustomAction_CustomActionTemplate" 
                  BinaryKey="Binary_CustomActionTemplate" 
                  DllEntry="CustomActionTemplate" 
                  Execute="immediate" 
                  Return="check"/>
    
    <InstallUISequence>
        <Custom Action="CustomAction_CustomActionTemplate" After="LaunchConditions"/>
    </InstallUISequence>
    
    我认为问题在于什么时候——也就是说,在安装过程中——我做这两件事(导入和导出),但我不确定。也就是说,我需要将数据导入C代码,在C代码中执行操作,然后从C代码导出数据。但是怎么做?!?(向天空挥手)


    总而言之:如何在WiX中将数据导入和导出到C#自定义操作中(使用相同的C#代码)?

    AFAIK您不能在执行序列中更改属性值。如果我错了,有人可以纠正我,这将是你问题的另一个答案

    您应该能够在安装的UI阶段加密属性。在
    即时
    自定义操作中,您可以使用
    会话[“PROPERTYNAME”]
    访问msi属性,而不是
    会话。CustomActionData[“PROPERTYNAME”]
    。您还可以设置属性:
    session[“PROPERTYNAME”]=“新值字符串”

    然后在添加信息的页面上的下一个/Install控件上,您可以将

    <Control Id="Install" ...>
        <Publish Event="DoAction" Value="EncodeAndSetValuesAction">1</Publish>
        ....
    </Control>
    
    
    1.
    ....
    
    如果它们被标记为
    Secure='yes'
    和public(所有caps名称),那么它们在安装的执行阶段应该可以使用编码的值

    请注意,如果使用DoAction控件事件启动自定义操作(在用户输入值的页面上单击“下一步”),则无法在msi日志中获取日志信息。有关更多信息,请参阅

    小编辑:当你编辑这个问题时,我正在写这个答案,这个问题表明你已经知道如何获取属性并立即设置它们

    或者,您可以在InstallInitialize(或WriteRegistryValue或anywhere?)之前(或WriteRegistryValues或anywhere?)安排一个即时自定义操作来加密和设置InstallExecuteSeSequence中的值,并在安装的提升服务器部分开始之前设置属性。我认为InstallExecuteSequence分为两部分。一种方法,它通过计算值和要安装的文件,为安装的提升服务器部分生成安装脚本,在该部分中它实际复制文件并写入注册表项等。此部分仍然是客户端上下文,您可以在其中运行即时自定义操作和读取/设置属性。其次,它将使用set-in-stone属性启动安装的服务器部分,并遵循刚刚创建的执行脚本


    我决定在这里对立即和延迟的自定义操作之间的差异做一个简短的解释

    延迟和立即自定义操作之间基本上有两个主要区别。即时自定义操作可以直接访问msi DB以读取和/或修改属性,但无法执行任何需要提升的操作,除非安装程序以“管理员”身份运行,因为它在用户上下文中运行


    延迟操作只能在执行序列中运行,并且只能读取通过与操作同名的CustomActionData显式设置的属性值,但它们始终具有提升的权限

    我在我的答案中添加了一个替代选项,以防您已经阅读了它,但没有看到编辑。答案有点乱,这个问题实际上源于这个问题。我最初计划做的是从UI中获取属性,并在C代码中设置注册表。但是,我无法在卸载过程中删除在C#code中创建的注册表(我不想成为在用户注册表中留下随机垃圾的开发人员)。所以我想也许我应该在WiX中重新设置注册表,只在自定义操作中加密属性。尽管如此,事实是我不了解安装过程的顺序:如何使某些内容在其他内容之前发生,等等。坦率地说,这种无知让我很难分析您的“可选”建议,您对即时和延迟自定义操作之间的区别的简短解释非常有用(谢谢!)。因此,我要做的是学习一些东西,重新阅读你的“可选”建议,并试一试。@Bob一个可以用来进一步了解排序的好工具是Microsoft的Orca.exe。您可以查看InstallExecuteSequence表并按“顺序”对其排序,并查看所有操作(自定义和标准)的运行顺序。在执行序列中,立即的vs延迟的有点奇怪,因为我认为所有的立即的先运行,然后在第二个过程中延迟的运行。这就是为什么我将“anywhere?”作为一个有效的排序,因为它应该在任何延迟操作之前运行。此外,您应该能够在延迟自定义操作中删除您创建的注册表项,该操作在“RemoveRegistryValues”之后排序,并且只需确保条件是
    而不是UPGRADINGPRODUCTCODE并删除~=“ALL”
    让我问一下您最初的建议。您的意思是我可能可以在InstallUISequence中执行加密自定义操作,对吗?然后删除InstallExecuteSequence中的密钥?如果是这种情况,那么值是
    Encod吗
    
    <Binary Id="Binary_CustomActionTemplate" 
            SourceFile="$(var.CustomAction.TargetDir)CustomAction.CA.dll"/>
    
    <CustomAction Id="CustomAction_CustomActionTemplate" 
                  BinaryKey="Binary_CustomActionTemplate" 
                  DllEntry="CustomActionTemplate" 
                  Execute="immediate" 
                  Return="check"/>
    
    <InstallUISequence>
        <Custom Action="CustomAction_CustomActionTemplate" After="LaunchConditions"/>
    </InstallUISequence>
    
        [CustomAction]
        public static ActionResult CreateKeys(Session session)
        {
            session["VALUE"] = "Hello, world.";
            return ActionResult.Success;
        }
    
    <Control Id="Install" ...>
        <Publish Event="DoAction" Value="EncodeAndSetValuesAction">1</Publish>
        ....
    </Control>