2009-11-05 68 views
3

我使用維克斯安裝一個Windows安裝程序.msi文件。我有一個CustomAction設置了一個ScheduledTask,並且在CustomAction中,我已經放入了一些session.Log語句。維克斯CustomAction SESSION.LOG不工作

如果我建立在調試模式應有盡有,SESSION.LOG語句似乎工作,但是當我建立在Release模式,它似乎不再登錄。它是否正確?還是有其他場景session.Log不會工作?有沒有什麼辦法可以解決這些情況,這樣session.Log總是有效的?

編輯:CustomAction是用C#(即管理)

回答

1

,如果你說你用的是什麼語言,這就幫...

如果您使用託管代碼...警惕限制(以下從維克斯文件的引用)

之前選擇寫在託管代碼,而不是傳統的本地C++代碼自定義操作,您應該謹慎考慮以下幾點:

  • 顯然,它引入了基於.NET Framework的依賴性。你的MSI包可能應該有一個LaunchCondition來在任何事情發生之前檢查是否存在正確版本的.NET Framework。

  • 如果自定義操作,在卸載時運行,那麼即使你的產品的卸載,如果可以在.NET Framework不存在失敗。這意味着如果用戶在產品之前卸載.NET Framework,用戶可能會遇到問題。

  • 託管自定義操作應當被配置爲針對.NET Framework的一個特定版本運行,該版本應該與你的實際產品違背了版本。允許版本「浮動」到最新安裝的.NET Framework可能會導致未來版本的兼容性問題。 .NET Framework提供了很好的理由 - 並行功能 - 使用它。

此外,您也應該瞭解爲什麼VBScript (and JScript) MSI CustomActions suck

無論如何,無視一切......這裏是我發現的地方在很久以前,我使用的日誌記錄一些示例C++代碼。您可能能夠找出應該用您選擇的語言調用的正確功能。

#define _USE_RTM_VERSION 

void LogString(MSIHANDLE hInstall, TCHAR* szString) 
{ 
    PMSIHANDLE newHandle = ::MsiCreateRecord(2); 
    TCHAR szTemp[MAX_PATH * 2]; 
    sprintf_s(szTemp, MAX_PATH * 2, "-- MSI_LOGGING -- %s", szString); 
    MsiRecordSetString(newHandle, 0, szTemp); 
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_INFO), newHandle); 
} 

UINT __stdcall MyCustomAction (MSIHANDLE hModule) 
{ 
    LogString(hModule, "Whoa! I am a custom action.."); 
    return ERROR_SUCCESS; 
} 
+0

我一直在使用JavaScript自定義操作了良好的效果。比C++更容易編寫。沒有像C#那樣的額外的.NET依賴。 try ... catch使它相當健壯。 – Cheeso 2009-11-23 23:16:33

0

記錄內容由記錄選項管理。與安裝調試版本時相比,當您安裝發行版時,您的選擇是否相同?