c# - 如何通过调用带字符串参数的 WiX 自定义操作的 Installshield 创建自定义操作?

标签 c# wix windows-installer installshield custom-action

Installshield 是否有可能运行一个 WiX 自定义操作,该操作采用除必需的 session 参数之外的其他参数?例如:

[CustomAction]
public static ActionResult CustomAction1(Session session, string param)
{
  session.Log(param);
  return ActionResult.Success;
}

(注意第二个参数)

我正在通过 Installshield 2012 创建 Type 1 自定义操作。它需要一个函数名称,但我看不到添加参数的方法。 我想我希望能在这里破解,所以如果通过 MSI 数据库存在不受支持的机制,请分享

我能够使用 Installshield Interop,甚至仅限于字符串参数,它允许在我的安装项目中二进制重用的一个很好的解决方案,其中安装项目控制特定参数,而不是自定义操作代码本身。

最佳答案

我不认为可以将额外的参数传递给自定义操作方法。它由 Windows Installer 调用,它需要一个定义明确的签名似乎是合理的。

但是,您可以变通。如果您需要将一些数据传递给自定义操作,您可以为此使用 Session 对象。

如果您的自定义操作是即时的,您可以像这样在自定义操作代码中处理 MSI 属性:

session["PROPERTYNAME"] = "some value";

在即时自定义操作中,session 对象可以寻址属性表中的任何属性。

如果您的自定义操作被推迟,则有一种机制可以将必要的数据传递给它。您应该创建一个通常的即时“设置属性”自定义操作,并将必要的数据传递给名为延迟 CA 名称的属性。样本通常比将其塑造成文字更清晰:

<!-- This is a subsidiary CA, note the property name is equal to the deferred CA name -->
<CustomAction Id="SetForMyDeferredCA" Return="check" Property="MyDeferredCA" Value="source=[SourceFolder];target=[TargetFolder]"/>
<!-- And this is the deferred CA which does the job -->
<CustomAction Id="MyDeferredCA" Return="asyncWait" Execute="deferred" BinaryKey="CustomActions" DllEntry="MyMethodName" />

在延迟 CA 中,您可以像这样处理传递的数据:

var source = session.CustomActionData["source"];
var target = session.CustomActionData["target"];

希望这对您有所帮助。

关于c# - 如何通过调用带字符串参数的 WiX 自定义操作的 Installshield 创建自定义操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21397099/

相关文章:

c# - 如何执行字符串中的代码?

c# - 没有 new() 的泛型

database - Wix 可以默默地不覆盖数据库吗

Wix 安装多个应用程序

wix - 为什么按用户安装使用 WixUI_Advanced 构建的 MSI 需要提升权限?

C# P4Api 使用 -zversion 和 -zprog 进行自定义日志记录

c# - 是否可以从 EF Core 7 PropertyBuilder 获取提供程序信息

wix - 使用 WiX 将 dll 安装到 gac

WiX 从注册表困惑中检索路径

iis - Installshield安装要求用户在安装了iis7的机器上有iisadmin