C# 用于在文本中写入Installfolder的Wix自定义操作实现
我有以下Wix代码,它应该将属性的值发送到用C#编写的自定义操作。基本上我想要的是当安装MSI时,我想在文本文件中写入Wix安装程序的文件夹路径。我参考了网站并相应地创建了代码,但我的自定义操作不起作用 以下是我的Wix文件:C# 用于在文本中写入Installfolder的Wix自定义操作实现,c#,visual-studio-2010,wix,windows-installer,C#,Visual Studio 2010,Wix,Windows Installer,我有以下Wix代码,它应该将属性的值发送到用C#编写的自定义操作。基本上我想要的是当安装MSI时,我想在文本文件中写入Wix安装程序的文件夹路径。我参考了网站并相应地创建了代码,但我的自定义操作不起作用 以下是我的Wix文件: <?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" Name="S
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="SetupInstallFolder" Language="1033" Version="1.0.0.0" Manufacturer="LP" UpgradeCode="9e10a7d8-4ffb-493c-8318-c44ba4bc0c4c">
<Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="SetupInstallFolder" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="SetupInstallFolder" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="SomeRandomEXE">
<File Source ="G:\SarVaGYa\myworkspace\LatestLpa\lpa\lpa_c\here\src\lpa\Release\lpa.exe" />
</Component>
</ComponentGroup>
<Binary Id="SetupCA2" src="G:\visual studio stuffs\SetupCAInstallFolder\SetupCAInstallFolder\bin\Release\SetupCAInstallFolder.CA.dll"/>
<CustomAction Id="INSTALLFOLDERFINDER" Execute="immediate" Property="INSTALLEDPATH" Value="[INSTALLFOLDER]" />
<InstallExecuteSequence>
<Custom Action="INSTALLFOLDERFINDER" Sequence="2"></Custom>
</InstallExecuteSequence>
</Fragment>
</Wix>
Wix文件编译并提供未获取值INSTALLEDPATH的MSI。如果我在CustomAction标记中添加DllEntry=“InstallFolderFinder”,它将失败,并出现错误,CustomAction/@DllEntry属性不能与此元素上以前指定的属性共存。CustomAction元素一次只能指定以下目标属性之一:DllEntry、Error、ExeCommand、JScript调用、Script、Value或VBScriptCall
如何将INSTALLEDPATH的值传递给C#自定义操作?MSI正在确定操作
CostInitialize
和CostFinalize
之间的路径。
很少推荐使用硬编码序列,可能您为此选择了错误的序列号
尝试:
我希望您确定,INSTALLDEDPATH
是您的正确属性。路径的MSI基本属性为“TARGETDIR”
如果仍然不起作用,请尝试自定义操作类型51,并在
[INSTALLEDPATH]
的值上设置属性MYDUMMY
。现在您可以看到,是否至少在未编程的标准自定义操作中正确写入了值。MSI正在确定操作CostInitialize
和CostFinalize
之间的路径。
很少推荐使用硬编码序列,可能您为此选择了错误的序列号
尝试:
我希望您确定,INSTALLDEDPATH
是您的正确属性。路径的MSI基本属性为“TARGETDIR”
如果仍然不起作用,请尝试自定义操作类型51,并在
[INSTALLEDPATH]
的值上设置属性MYDUMMY
。现在您可以看到,如果至少在未编程的标准自定义操作中正确写入了该值。我在多个站点上跌跌撞撞地解决了这个问题。我已经在要点中添加了代码。Wix文件代码为,C#自定义操作代码为。基本上我补充说
InstallExexuteSequence中的两个自定义标记,第一个加载dllentry,第二个将参数传递给用C#编写的自定义操作。我在访问了更多站点后解决了这个问题。我已经在要点中添加了代码。Wix文件代码为,C#自定义操作代码为。基本上我补充说
InstallExexuteSequence中的两个自定义标记,第一个加载dllentry,第二个将参数传递给用C#编写的自定义操作。Phillm感谢您的见解。通过谷歌搜索,我找到了解决方案。我确信它现在可以工作了。仅供参考:您找到的解决方案是延迟自定义操作的解决方案(正如您在WiX代码中参数化的那样:Execute=“deferred”)。对于简单地读取属性,延迟的自定义操作不是很舒服(如您所见,首先您需要另一个自定义操作将必要的属性推到其中)。这就是我刚才在你的最后一个问题上提到的。对于简单地读取属性来说,立即进行自定义操作就足够了,但是您需要按照我的回答中所述的顺序选择正确的位置。Phillm感谢您的见解。通过谷歌搜索,我找到了解决方案。我确信它现在可以工作了。仅供参考:您找到的解决方案是延迟自定义操作的解决方案(正如您在WiX代码中参数化的那样:Execute=“deferred”)。对于简单地读取属性,延迟的自定义操作不是很舒服(如您所见,首先您需要另一个自定义操作将必要的属性推到其中)。这就是我刚才在你的最后一个问题上提到的。对于简单地读取属性来说,立即执行自定义操作就足够了,但是您需要按照我的回答中所述的顺序选择正确的位置。有趣的是,我喜欢这个解决方案,我没有想到使用另一个自定义操作来根据UI值设置值。很好。我的答案见我的评论。这是延迟自定义操作(如果有人需要延迟CA)的一个很好的工作示例。有趣的是——我喜欢这个解决方案,我没有想到使用另一个自定义操作来根据UI值设置值。很好。我的答案见我的评论。这是延迟自定义操作的一个很好的工作示例(如果有人需要延迟CA)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Deployment.WindowsInstaller;
namespace SetupCAInstallFolder
{
public class CustomActions
{
[CustomAction]
public static ActionResult InstallFolderFinder(Session session)
{
session.Log("Here is the SetupCAInstallFolder");
string path = session["INSTALLEDPATH"];
session.Log("Installed Path is " + path);
System.IO.File.WriteAllText("F:\\pathgenerated.txt", path);
//System.IO.File.WriteAllText(path + "installed.txt", "sdkasdkasdlkasdk");
return ActionResult.Success;
}
}
}
<InstallExecuteSequence>
<Custom Action='INSTALLFOLDERFINDER' After='CostFinalize'></Custom>
</InstallExecuteSequence>