using Microsoft.Deployment.WindowsInstaller;
using System;
using System.IO;
using System.Runtime.InteropServices;
using TestLibrary;
namespace TestAction
{
/// <summary>
/// 커스텀 액션
/// </summary>
public class CustomAction
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Import
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 전경 윈도우 구하기 - GetForegroundWindow()
/// <summary>
/// 전경 윈도우 구하기
/// </summary>
/// <returns>윈도우 핸들</returns>
[DllImport("user32")]
private static extern IntPtr GetForegroundWindow();
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 로그 헬퍼
/// </summary>
private static ILogHelper _logHelper = new FileLogHelper("d:\\", "TestNode.log");
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 설치 전 액션 실행하기 - ExecuteBeforeInstallAction(session)
/// <summary>
/// 설치 전 액션 실행하기
/// </summary>
/// <param name="session">세션</param>
/// <returns>액션 결과</returns>
[CustomAction]
public static ActionResult ExecuteBeforeInstallAction(Session session)
{
_logHelper?.WriteLog($"BEGIN EXECUTE BEFORE FIRST INSTALL ACTION : {ApplicationEnvironment.Version}");
_logHelper?.WriteLog($"END EXECUTE BEFORE FIRST INSTALL ACTION : {ApplicationEnvironment.Version}");
return ActionResult.Success;
}
#endregion
#region 설치 후 액션 실행하기 - ExecuteAfterInstallAction(session)
/// <summary>
/// 설치 후 액션 실행하기
/// </summary>
/// <param name="session">세션</param>
/// <returns>액션 결과</returns>
[CustomAction]
public static ActionResult ExecuteAfterInstallAction(Session session)
{
_logHelper?.WriteLog($"BEGIN EXECUTE AFTER FIRST INSTALL ACTION : {ApplicationEnvironment.Version}");
#region 윈도우즈 서비스를 생성하고 시작한다.
try
{
string directoryPath = session["APPDIR"];
string filePath = Path.Combine(directoryPath, ApplicationEnvironment.ServiceFileName);
_logHelper?.WriteLog($"SERVICE FILE PATH : {filePath}");
WindowsServiceHelper.CreateWindowsService(ApplicationEnvironment.ServiceName, filePath);
_logHelper?.WriteLog("SERVICE CREATED");
WindowsServiceHelper.StartWindowsService(ApplicationEnvironment.ServiceName);
_logHelper?.WriteLog("SERVICE STARTED");
}
catch(Exception exception)
{
_logHelper?.WriteErrorLog(exception, "ERROR EXECUTE AFTER FIRST INSTALL ACTION");
return ActionResult.Failure;
}
#endregion
_logHelper?.WriteLog($"END EXECUTE AFTER FIRST INSTALL ACTION : {ApplicationEnvironment.Version}");
return ActionResult.Success;
}
#endregion
#region 업그레이드 전 액션 실행하기 - ExecuteBeforeUpgradeAction(session)
/// <summary>
/// 업그레이드 전 액션 실행하기
/// </summary>
/// <param name="session">세션</param>
/// <returns>액션 결과</returns>
[CustomAction]
public static ActionResult ExecuteBeforeUpgradeAction(Session session)
{
_logHelper?.WriteLog($"BEGIN EXECUTE BEFORE UPGRADE ACTION : {ApplicationEnvironment.Version}");
#region 윈도우즈 서비스를 중단하고 삭제한다.
try
{
string directoryPath = session["APPDIR"];
string filePath = Path.Combine(directoryPath, ApplicationEnvironment.ServiceFileName);
_logHelper?.WriteLog($"SERVICE FILE PATH : {filePath}");
WindowsServiceHelper.StopWindowsService(ApplicationEnvironment.ServiceName);
_logHelper?.WriteLog("SERVICE STOPPED");
WindowsServiceHelper.DeleteWindowsService(ApplicationEnvironment.ServiceName);
_logHelper?.WriteLog("SERVICE DELETED");
}
catch(Exception exception)
{
_logHelper?.WriteErrorLog(exception, "ERROR EXECUTE BEFORE UPGRADE ACTION");
}
#endregion
_logHelper?.WriteLog($"END EXECUTE BEFORE UPGRADE ACTION : {ApplicationEnvironment.Version}");
return ActionResult.Success;
}
#endregion
#region 업그레이드 후 액션 실행하기 - ExecuteAfterUpgradeAction(session)
/// <summary>
/// 업그레이드 후 액션 실행하기
/// </summary>
/// <param name="session">세션</param>
/// <returns>액션 결과</returns>
[CustomAction]
public static ActionResult ExecuteAfterUpgradeAction(Session session)
{
_logHelper?.WriteLog($"BEGIN EXECUTE AFTER UPGRADE ACTION : {ApplicationEnvironment.Version}");
#region 윈도우즈 서비스를 생성하고 시작한다.
try
{
string directoryPath = session["APPDIR"];
string filePath = Path.Combine(directoryPath, ApplicationEnvironment.ServiceFileName);
_logHelper?.WriteLog($"SERVICE FILE PATH : {filePath}");
WindowsServiceHelper.CreateWindowsService(ApplicationEnvironment.ServiceName, filePath);
_logHelper?.WriteLog("SERVICE CREATED");
WindowsServiceHelper.StartWindowsService(ApplicationEnvironment.ServiceName);
_logHelper?.WriteLog("SERVICE STARTED");
}
catch(Exception exception)
{
_logHelper?.WriteErrorLog(exception, "ERROR EXECUTE AFTER UPGRADE ACTION");
}
#endregion
_logHelper?.WriteLog($"END EXECUTE AFTER UPGRADE ACTION : {ApplicationEnvironment.Version}");
return ActionResult.Success;
}
#endregion
#region 설치 제거 전 액션 실행하기 - ExecuteBeforeUninstallAction(session)
/// <summary>
/// 설치 제거 전 액션 실행하기
/// </summary>
/// <param name="session">세션</param>
/// <returns>액션 결과</returns>
[CustomAction]
public static ActionResult ExecuteBeforeUninstallAction(Session session)
{
_logHelper?.WriteLog($"BEGIN EXECUTE BEFORE UNINSTALL ACTION : {ApplicationEnvironment.Version}");
IntPtr windowHandle = GetForegroundWindow();
System.Windows.Forms.MessageBox.Show(new WIN32Window(windowHandle), "ExecuteBeforeUninstallAction");
#region 윈도우즈 서비스를 중단하고 삭제한다.
try
{
string directoryPath = session["APPDIR"];
string filePath = Path.Combine(directoryPath, ApplicationEnvironment.ServiceFileName);
_logHelper?.WriteLog($"SERVICE FILE PATH : {filePath}");
WindowsServiceHelper.StopWindowsService(ApplicationEnvironment.ServiceName);
_logHelper?.WriteLog("SERVICE STOPPED");
WindowsServiceHelper.DeleteWindowsService(ApplicationEnvironment.ServiceName);
_logHelper?.WriteLog("SERVICE DELETED");
}
catch(Exception exception)
{
_logHelper?.WriteErrorLog(exception, "ERROR EXECUTE BEFORE UNINSTALL ACTION");
}
#endregion
_logHelper?.WriteLog($"END EXECUTE BEFORE UNINSTALL ACTION : {ApplicationEnvironment.Version}");
return ActionResult.Success;
}
#endregion
#region 설치 제거 후 액션 실행하기 - ExecuteAfterUninstallAction(session)
/// <summary>
/// 설치 제거 후 액션 실행하기
/// </summary>
/// <param name="session">세션</param>
/// <returns>액션 결과</returns>
[CustomAction]
public static ActionResult ExecuteAfterUninstallAction(Session session)
{
_logHelper?.WriteLog($"BEGIN EXECUTE AFTER UNINSTALL ACTION : {ApplicationEnvironment.Version}");
IntPtr windowHandle = GetForegroundWindow();
System.Windows.Forms.MessageBox.Show(new WIN32Window(windowHandle), "ExecuteAfterUninstallAction");
_logHelper?.WriteLog($"END EXECUTE AFTER UNINSTALL ACTION : {ApplicationEnvironment.Version}");
return ActionResult.Success;
}
#endregion
}
}