我在installShield 2012中创建了一个延迟/系统上下文自定义操作,该操作调用了托管方法。此程序集存储在二进制表中,但如果需要,我可以更改为随产品一起安装。我想将一个参数传递给我的托管方法,以便:
1)获取公共属性的值
2)也许写入Windows安装程序日志文件
我一直在使用this article作为指导,但我认为它太模糊而不是非常有用(或者我只是不理解它)。我已经尝试了他们的默认方法签名和我自己的。我不清楚如果我使用默认值会发生什么。例如,它说它将使用msihandle参数调用我的方法,但是我应该如何在我的托管代码中获取msihandle并使用它做一些有用的事情?吗
有什么好的例子可以说我的搜索丢失了吗?如果我无法获得与属性值一样简单的东西,我认为使用托管自定义操作几乎没用。
答案 0 :(得分:2)
简而言之,Flexera在其他人拒绝尝试的时候,在管理自定义操作方面做了很多努力。但是他们的基础架构已经被Windows Installer XML(WiX)部署工具基础(DTF)所取代。这是托管代码自定义操作的黄金标准。所有的赌注,您可以将它与InstallShield一起使用,因为它输出的DLL只显示为本机Type1 MSI DLL自定义操作。
答案 1 :(得分:2)
文档Managed Custom Action Sample涵盖了InstallShield托管代码自定义操作支持的大多数用法。您可以在InstallShield安装的Samples\WindowsInstaller\Managed Custom Actions
子文件夹中找到它和相关的示例代码。
如果您想直接使用MSIHANDLE
,请使用非自定义签名,为您的函数声明UInt32
参数,为MsiGetProperty
,{{{{}}等调用启用P / Invokes 1}},等等,将MsiProcessMessage
句柄传递给这些P / Invokes。如果您想使用可用的UInt32
来提供P / Invokes,则托管自定义操作示例也涵盖了这一点;包括InstallShield.Interop.Msi
中显示的帮助程序类CustomActionHandle
的示例用法。
如果您更愿意使用自定义签名支持,则只需为要传递给函数的每个属性创建一个字符串参数,并指定要在每个位置传递的属性。除非您也传递了MsiHandle,否则在这种情况下将无法写入日志文件。