Windows installer 如何从运行安装程序到托管自定义操作(C#)中获取属性值和msihandle

Windows installer 如何从运行安装程序到托管自定义操作(C#)中获取属性值和msihandle,windows-installer,installshield,custom-action,Windows Installer,Installshield,Custom Action,我在installShield 2012中创建了一个延迟/系统上下文自定义操作,该操作调用一个托管方法。此程序集存储在二进制表中,但如果需要,我可以更改为随产品一起安装。我想向我的托管方法传递一个参数,以便: 1) 获取公共属性的值 2) 可能会写入windows安装程序日志文件 我一直在使用它作为指导,但是我认为它太模糊了,不太有用(或者我就是不理解它)。我已经尝试了他们的默认方法签名和我自己的方法签名。不清楚如果我使用默认值会发生什么。例如,它说它将使用msihandle参数调用我的方法,,

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

1) 获取公共属性的值

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

我一直在使用它作为指导,但是我认为它太模糊了,不太有用(或者我就是不理解它)。我已经尝试了他们的默认方法签名和我自己的方法签名。不清楚如果我使用默认值会发生什么。例如,它说它将使用msihandle参数调用我的方法,,但是我应该如何在托管代码中获取msihandle并使用它做一些有用的事情呢??


有没有我的搜索遗漏的好例子?如果我不能得到像属性值这样简单的东西,那么我认为使用托管自定义操作没有什么用处。

简单地说,Flexera在其他人拒绝尝试的时候,在托管自定义操作方面做了很多努力。但是他们的基础设施已经被Windows安装程序XML(WIX)部署工具基金会(DTF)所取代。这是托管代码自定义操作的黄金标准。值得打赌的是,您可以将其与InstallShield一起使用,因为它输出的DLL仅显示为本机Type1 MSI DLL自定义操作。

简单地说,Flexera在其他人拒绝尝试时,在托管自定义操作方面做了大量工作。但是他们的基础设施已经被Windows安装程序XML(WIX)部署工具基金会(DTF)所取代。这是托管代码自定义操作的黄金标准。更重要的是,您可以将其与InstallShield一起使用,因为它输出的DLL仅显示为本机Type1 MSI DLL自定义操作。

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

如果要直接使用
MSIHANDLE
,请使用非自定义签名,为函数声明
UInt32
参数,并对调用进行p/Invokes,如
MsiGetProperty
MsiProcessMessage
,等等,将
UInt32
句柄传递给这些p/Invokes。如果您想使用可用的
InstallShield.Interop.Msi
来提供P/Invokes,那么托管自定义操作示例也包括这一点;包括
MsiWrapper.cs
中显示的助手类
CustomActionHandle
的示例用法

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

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

如果要直接使用
MSIHANDLE
,请使用非自定义签名,为函数声明
UInt32
参数,并对调用进行p/Invokes,如
MsiGetProperty
MsiProcessMessage
,等等,将
UInt32
句柄传递给这些p/Invokes。如果您想使用可用的
InstallShield.Interop.Msi
来提供P/Invokes,那么托管自定义操作示例也包括这一点;包括
MsiWrapper.cs
中显示的助手类
CustomActionHandle
的示例用法


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

看来WiX肯定是赢家,我计划向它提交新项目。“它输出仅显示为本机Type1 MSI DLL的DLL”。您是说InstallShield在设计时将我的托管代码转换为本机代码吗?我将尝试您在本文中发布的MSInterop类:。如果我遵循您的步骤,我应该能够将msi句柄放入托管代码中,并使用GetProperty和SetProperty,即使这是从延迟/系统上下文自定义操作调用的,对吗?也可以扩展会话类来支持诸如写入日志之类的事情吗?(我在上找不到任何有用的文档来登录windows installer SDK,所以我有疑问)修正案:MSInterop类是您的文章中提到的东西您应该忽略我在DTF发布之前写的所有托管自定义操作文章。DTF具有Microsoft.Deployment.WindowsInstaller程序集,该程序集使msinterop.cs看起来像语法学校的项目。:)DTF用本机DLL封装托管程序集。在运行时,它会自动提取、启动CLR并在两个API调用之间创建一个命名管道,以来回调用marshall API。它与MSI和thefore InstallShield 100%兼容。看起来WiX肯定是赢家,我计划将新项目带到它身上。“它输出仅显示为本机Type1 MSI DLL的DLL”。您是说InstallShield在设计时将我的托管代码转换为本机代码吗?我将尝试您在本文中发布的MSInterop类:。如果我遵循您的步骤,我应该能够将msi句柄放入托管代码中,并使用GetProperty和SetProperty,即使这是从延迟/系统上下文自定义操作调用的,对吗?是否也可以扩展会话类以支持