新的一天,新的问题;-)仍然需要与托管自定义操作斗争。我已经设法调用自定义操作并将一些测试数据传递给它。现在我想用我需要的真实数据替换testdata。这里问题就出现了:我想调用一个安装在我的安装子目录中的批处理文件。因此,我需要将安装路径传递给自定义操作。 Afaik这可以使用customactiondata mechnism完成。但这不起作用。当我记录安装时,我可以看到习惯用户INSTALLLOCATION之外指向正确的路径,但是当我查看惯例时,customactiondata属性为空...
任何人都可以查看我的代码并给我一个提示我做错了什么?谢谢你的推荐!
调用自定义操作的合并模块:
<Module Id="DflHelpInstaller" Language="1033" Version="1.0.0.0">
<Package Id="f952de58-1dc6-46b3-872a-7a49e2d9ea0a" Manufacturer="DflHelpInstaller" InstallerVersion="200" />
<Binary Id='RegisterDflHelpDll' SourceFile="$(var.REGISTERHELP.TargetDir)RegisterDflHelp.CA.dll" />
<CustomAction Id='RegisterDflHelp' BinaryKey='RegisterDflHelpDll' DllEntry='RegisterDflHelp' Execute='deferred' />
<CustomAction Id="RegisterDflHelp.SetProperty" Return="check" Property="RegisterDflHelp" Value='[INSTALLLOCATION]' Execute='immediate' />
<InstallExecuteSequence>
<Custom Action='RegisterDflHelp.SetProperty' After='CostFinalize' />
<Custom Action='RegisterDflHelp' After='InstallFiles' />
</InstallExecuteSequence>
<Directory Id="TARGETDIR" Name="SourceDir">
</Directory>
<ComponentGroupRef Id="HelpGroup"/>
</Module>
</Wix>
使用MergeModule的安装程序项目概述:
...
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" SourceName="PFFiles">
<Directory Id="Company" Name='$(var.COMPANY)'>
<Directory Id="INSTALLLOCATION" SourceName='$var.v[SDK_VERSION]'>
<Component Id="MyBanner" Guid="C8C28B92-9326-4991-BFB1-BBDFDF3653AB">
<File Id ="Banner.bmp" Source="Banner.bmp" KeyPath="yes" DiskId="1"/>
</Component>
<Merge Id ="DflHelpInstaller" SourceFile="DflHelpInstaller.msm" Language="1033" DiskId="1" />
</Directory>
</Directory>
...
<Feature Id="Complete" Title="Setup" Description="Installs the SDK on your local machine." Display="expand" Level="1" ConfigurableDirectory="INSTALLLOCATION">
<ComponentRef Id="Banner" />
<ComponentRef Id ="UNINSTALLER"/>
<ComponentGroupRef Id="ReferenceGroup"/>
<MergeRef Id="DflHelpInstaller"/>
</Feature>
CustomAction:
public class CustomActions
{
[CustomAction]
public static ActionResult RegisterDflHelp(Session session)
{
session.Log("Begin CustomAction1");
session.Log("Before Access to customactiondata");
//should contain the installation path - unfortunatelly it is empty! why?
string cad = session["CustomActionData"];
Debugger.Break();
RegisterHelp(cad);
session.Log("End of custom action..");
return ActionResult.Success;
}
答案 0 :(得分:18)
如果您将数据描述为......
<CustomAction Id="MyCustomActionData" Return="check" Property="MyCustomAction" Value='PROPERTY0=[PROPERTY0];PROPERTY1=[PROPERTY1];PROPERTY2=[PROPERTY2]' Execute='immediate' />
您可以访问以下数据:
string property0 = session.CustomActionData["Property0"];
string property1 = session.CustomActionData["Property1"];
string property2 = session.CustomActionData["Property2"];
在上一个示例中,您将使用:
<CustomAction Id="RegisterDflHelp.SetProperty" Return="check" Property="RegisterDflHelp" Value='INSTALLLOCATION=[INSTALLLOCATION]' Execute='immediate' />
然后
string cad = session.CustomActionData["INSTALLLOCATION"];
答案 1 :(得分:5)
我使用.WXS文件中的以下内容完成了此操作:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="ManufacturerDir" Name="Company" ShortName="Company">
<Directory Id="INSTALLDIR" Name="TheApp">
<Directory Id="BatchFileLocation" Name="BatchFiles">
<Component Id="BatchFilesComp" ... >
<File Id="SomeFile_BAT" Source="BatchFiles\SomeFile.bat" Name="SomeFile.bat" ... />
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
在自定义动作中:
var batchDirectory = session.GetTargetPath("BatchFileLocation");
var batchFile = batchDirectory + "SomeFile.bat"
现在,我还没有想出如何避免重复文件名,但这确实成功返回批处理文件的安装位置。
答案 2 :(得分:2)
您正确传递了值,但请尝试以此方式引用它。
string[] keys = new string[session.CustomActionData.Keys.Count];
session.CustomActionData.Keys.CopyTo(keys, 0);
string cad = keys[0];
这应该将cad
设置为您想要的安装路径。
答案 3 :(得分:2)
经过几个小时的碾压,以下工作对我有用:
string UserDefinedInstallDir = session["INSTALLDIR"];
希望它能帮助其他人!
答案 4 :(得分:0)
您是否尝试过直接从托管CA中查询INSTALLLOCATION属性?
string cad = session["INSTALLLOCATION"];
使用DTF的一个优点是您可以对所有MSI属性进行读/写访问,而无需使用命令行等。因此即使无法像普通属性那样查询INSTALLLOCATION,您也可以定义自己的MSI属性将其设置为INSTALLOCATION的值,然后在CA中查询该值。