첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
728x90
728x170

TestSolution.zip
1.39MB
TestSolution.Deployment.zip
6.64MB

[TestAction 프로젝트]

▶ CustomAction.cs

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
    }
}

※ 커스텀 액션 코드만 수정하고 테스트를 하였다. 배포는 '커스텀 액션을 사용해 윈도우즈 서비스 실행하기' 자료를 참조한다.

728x90
그리드형(광고전용)
Posted by icodebroker
,