2009-09-27 98 views
3

我有一個InstallShield MSI項目。當我將一個MSIHANDLE從InstallScript自定義操作傳遞給通過DotNetCoCreateObject()初始化的託管程序集時,我的託管代碼中收到的值爲-2。MSI日誌調試日誌接收器

有誰知道是否有可能從通過DotNetCoCreateObject()調用到託管代碼中的InstallScript自定義操作訪問MSIHANDLE?我想將自定義操作結果記錄到與安裝的其他部分相同的日誌文件中。我正在使用InstallShield 2010,Windows Install 4.5和.Net 3.5。

回答

4

只可能通過託管自定義操作,需要使用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沒有數字簽名,因此大會您的託管自定義操作也必須未經簽名。

+0

另一件事要記住的是,這只是工作,如果該CustomAction不是從控制事件DoAction調用。我有一個使用這種方法的消息寫入日誌的自定義操作。爲了測試這個,我將該操作附加到UI中的按鈕按鈕上,並且也作爲InstallExecuteSequence中的操作。附加到UI的操作沒有記錄該語句,而當相同的操作作爲ExecuteSequence的一部分運行時,它將其記錄到日誌中。 – ksun

+0

顯然,這是因爲MsiProcessMessage不能從DoAction控件事件中工作。解決這個問題的方法是使用您要記錄的消息來設置屬性。 – ksun

+0

我加入上面的代碼 ----- 異常已通過調用的目標引發異常後得到以下錯誤MSI日誌。 ---> System.IO.FileNotFoundException:無法加載文件或程序集「InstallShield.Interop.Msi,版本= 23.0.0.511,Culture = neutral,PublicKeyToken = null」或其某個依賴項。該系統找不到指定的文件。 ---- 我添加了這個DLL到我的項目,我可以看到輸出目錄,但如何加載InstallShield.Interop.Msi DLL到安裝程序? – Santhosh

0

不,這是不可能的。你必須自己管理你的日誌輸出。

0

澄清的另一角是有兩個項目類型,安裝InstallScript & MSI。您只能訪問MSI項目中的MSI句柄。