帮助!我需要在我的Wix 3.5安装项目中执行托管自定义操作,无论我尝试过什么,都无法让它工作。
我正在使用Visual Studio 2010中的Votive集成。除了一些文本更改之外,我的Wix Product.wxs文件与visual studio模板基本没有变化:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="666ffc07-90b2-4608-a9f0-a0cc879f2ad0" Name="Product Name" Language="1033" Version="5.5.0002" Manufacturer="TiGra Astronomy" UpgradeCode="d17a5991-b404-4095-9e93-08d2db984cfd">
<Package InstallerVersion="200" Compressed="yes" />
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Directory Name">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<!-- <Component Id="ProductComponent" Guid="3ea5ade7-9b7b-40da-9e83-13e066a000ef"> -->
<!-- TODO: Insert files, registry keys, and other resources here. -->
<!-- </Component> -->
</Directory>
</Directory>
</Directory>
<Feature Id="ProductFeature" Title="ASCOM Driver" Level="1">
<!-- TODO: Remove the comments around this ComponentRef element and the Component above in order to add resources to this installer. -->
<!-- <ComponentRef Id="ProductComponent" /> -->
<!-- Note: The following ComponentGroupRef is required to pull in generated authoring from project references. -->
<ComponentGroupRef Id="Product.Generated" />
</Feature>
</Product>
我已设置对托管自定义操作项目的引用,将HARVEST属性设置为true。该项目名为WIX.CustomActions
,生成WIX.CustomActions.dll
和WIX.CustomActions.CA.dll
我看到Wix正在构建期间处理引用,WIX.CustomActions.dll
程序集显示在最终安装项目的二进制表中,但WIX.CustomActions.CA.dll
没有。
我有CustomActions.wxs
应该打包并调用自定义操作:
<?xml version="1.0" encoding="UTF-8" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<Binary Id="DriverRegistrationCA" SourceFile="$(var.WIX.CustomActions.TargetDir)\$(var.WIX.CustomActions.TargetName).CA.dll" />
<CustomAction Id="RegisterDriver" BinaryKey="DriverRegistrationCA" DllEntry="RegisterAscomDriver" Execute="deferred" Return="check" />
<CustomAction Id="UnregisterDriver" BinaryKey="DriverRegistrationCA" DllEntry="UnregisterAscomDriver" Execute="immediate" Return="check" />
<InstallExecuteSequence>
<Custom Action="RegisterDriver" After="InstallFinalize" />
<Custom Action="UnregisterDriver" Before="RemoveFiles" />
</InstallExecuteSequence>
</Fragment>
</Wix>
我看过互联网上的各种'howto'来源,他们充其量混淆,提出了相互矛盾的建议。据我所知,WIX.CustomActions.CA.dll
文件是一个非托管的DLL,它加载.NET框架并将控制权传递给“真正的”托管自定义操作。但是,WIX.CustomActions.CA.dll
未在我的MSI文件中打包。我尽可能地遵循示例,但我看不出有什么问题。
拜托,有没有人在Votive工作?你能给我一个实际的工作实例吗?
答案 0 :(得分:4)
您需要从产品到片段的引用(例如,CustomActionRef);否则,它被智能链接器丢弃。
答案 1 :(得分:1)
根据Bob Arnson的建议,我在Product.wxs文件的顶部附近添加了以下两行:
<CustomActionRef Id="RegisterDriver"/>
<CustomActionRef Id="UnregisterDriver"/>
这似乎已经成功了。 Orca现在显示我有一个二进制表,包含我的CA dll,以及InstallExecuteSequence中的CustomAction条目。
我在网上找到的所有例子都没有提到这个要求。我猜人们只是在很少或根本没有理解的情况下回收所获得的智慧所以这就是答案,感谢Bob!