C# MSI日志调试日志接收器

C# MSI日志调试日志接收器,c#,windows-installer,installshield,C#,Windows Installer,Installshield,我有一个InstallShield MSI项目。当我将MSIHANDLE从InstallScript自定义操作传递到通过DotNetCoCreateObject()初始化的托管程序集时,托管代码中接收到的值为-2 有人知道是否可以从通过DotNetCoCreateObject()调用托管代码的InstallScript自定义操作访问MSIHANDLE吗?我希望将自定义操作结果记录到与其余安装相同的日志文件中。我正在使用InstallShield 2010、Windows Install 4.5和

我有一个InstallShield MSI项目。当我将MSIHANDLE从InstallScript自定义操作传递到通过DotNetCoCreateObject()初始化的托管程序集时,托管代码中接收到的值为-2


有人知道是否可以从通过DotNetCoCreateObject()调用托管代码的InstallScript自定义操作访问MSIHANDLE吗?我希望将自定义操作结果记录到与其余安装相同的日志文件中。我正在使用InstallShield 2010、Windows Install 4.5和.Net 3.5。

不,这是不可能的。您必须自己管理日志输出。

另一个需要澄清的问题是,它有两种项目类型,InstallScript和MSI。您只能访问MSI项目中的MSI句柄。

只能通过托管自定义操作进行访问,并且需要使用InstallShield的InstallShield.Interop.MSI.dll来获取实际句柄

要从托管自定义操作写入MSI日志文件,请执行以下操作:

 using (Msi.Install msi = Msi.CustomActionHandle(_msiHandle))
 {
     using (Msi.Record record = new Msi.Record(100))
     {
         record.SetString(0, "LOG: [1]");
         record.SetString(1, entry.Message);
         msi.ProcessMessage(Msi.InstallMessage.Info, record);
     }
 }

注意:从IS2010开始,InstallShield.Interop.Msi.dll没有数字签名,因此带有托管自定义操作的程序集也必须是未签名的。

另一件需要记住的事情是,只有在控件事件上的DoAction没有调用CustomAction时,这才有效。我有一个自定义操作,它使用这种方法将消息写入日志。为了测试这一点,我将该操作附加到UI中的一个按钮按下,以及InstallExecuteSequence中的一个操作。附加到UI的操作没有记录该语句,而当同一操作作为ExecuteSequence的一部分运行时,它会将其记录到日志中。显然,这是因为MsiProcessMessage无法从DoAction控制事件中工作。解决此问题的一种方法是使用要记录的消息设置属性。添加上述代码后,我在MSI日志中看到以下错误------调用的目标已引发异常。-->System.IO.FileNotFoundException:无法加载文件或程序集“InstallShield.Interop.Msi,版本=23.0.0.511,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。---我将此dll添加到我的项目中,我可以在输出目录中看到,但如何将InstallShield.Interop.Msi dll加载到安装程序中?我通过将InstallShield.Interop.Msi dll添加到其他工具下的Direct Editor中的ISClrWrap表中,解决了上述错误。此表有3列。第一列->提供自定义操作名称,第二列“dependcy0”第三列“\system\InstallShield.Interop.Msi.dll”