1

我在 installShield 2012 中创建了一个延迟/系统上下文自定义操作,它调用了一个托管方法。该程序集存储在二进制表中,但如果需要,我可以更改为与产品一起安装。我想将一个参数传递给我的托管方法,以便:

1)获取公共属性的值

2) 可能写入 Windows 安装程序日志文件

我一直在使用这篇文章作为指导,但是我认为它太模棱两可而不能很有用(或者我只是不明白)。我已经尝试过他们的默认方法签名和我自己的。不清楚如果我使用默认值会发生什么..例如它说它将使用 msihandle 参数调用我的方法,但是我应该如何在我的托管代码中获取那个 msihandle 并用它做一些有用的事情?

有没有我的搜索丢失的好例子?如果我无法获得像属性值这样简单的东西,我认为使用托管自定义操作几乎没有用处。

4

2 回答 2

2

简而言之,在其他人拒绝尝试的时候,Flexera 在托管自定义操作方面做出了很好的努力。但他们的基础设施已经被 Windows Installer XML (WiX) 部署工具基金会 (DTF) 超越。这是托管代码自定义操作的黄金标准。最重要的是,您可以将它与 InstallShield 一起使用,因为它输出的 DLL 仅显示为本机 Type1 MSI DLL 自定义操作。

于 2013-10-23T21:35:55.990 回答
2

Managed Custom Action Sample文档涵盖了 InstallShield 的托管代码自定义操作支持的大多数用途。Samples\WindowsInstaller\Managed Custom Actions您可以在InstallShield 安装的子文件夹中找到它和相关的示例代码。

如果您想MSIHANDLE直接使用,请使用非自定义签名,UInt32为您的函数声明一个参数,并为诸如MsiGetProperty,等调用声明 P/Invokes MsiProcessMessage,将您的UInt32句柄传递给这些 P/Invokes。如果您想使用可InstallShield.Interop.Msi用于提供 P/Invokes,托管自定义操作示例也涵盖了这一点;包括帮助程序类的示例用法,CustomActionHandleMsiWrapper.cs.

如果您更愿意使用自定义签名支持,您可以为要传递给函数的每个属性创建一个字符串参数,并指定要在每个位置传递的属性。除非您还传递了 MsiHandle,否则在这种情况下将无法写入日志文件。

于 2013-10-25T21:40:12.830 回答