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

TestProject.zip
4.87MB

■ 디렉토리 구조

디렉토리 경로 설명
C:\TestProject AdvancedInstaller Updates Advanced Installer 업데이트 구성 프로젝트
C:\TestProject AdvancedInstaller V1 Advanced Installer 오피스 애드인 프로젝트 (버전 1)
C:\TestProject AdvancedInstaller V2 Advanced Installer 오피스 애드인 프로젝트 (버전 2)
C:\TestProject V1 Outlook 애드인 소스 코드 (버전 1)
C:\TestProject V2 Outlook 애드인 소스 코드 (버전 2)
C:\TestProject.WebServer 웹 서버 디렉토리

 

■ Outlook 애드인 소스 코드

※ 버전 1, 버전 2의 대부분 동일하나 경로나 명칭에서 달라질 수 있다.

 

[TestProject 프로젝트]

▶ CustomAddIn.cs

using Microsoft.Office.Tools;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;

namespace TestProject
{
    /// <summary>
    /// 커스텀 애드인
    /// </summary>
    public partial class CustomAddIn
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 커스텀 컨트롤
        /// </summary>
        private CustomControl customControl;
        
        /// <summary>
        /// 커스텀 태스크 창
        /// </summary>
        private CustomTaskPane customTaskPane;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 커스텀 애드인 시작시 처리하기 - CustomAddIn_Startup(sender, e)

        /// <summary>
        /// 커스텀 애드인 시작시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void CustomAddIn_Startup(object sender, EventArgs e)
        {
            #region 프로그램 디렉토리 경로를 설정한다.

            string programDirectoryPath = "c:\\DSCore\\TestProject";

            #endregion
            #region 프로그램 디렉토리가 없는 경우 생성한다.

            if (!Directory.Exists(programDirectoryPath))
            {
                Directory.CreateDirectory(programDirectoryPath);
            }

            #endregion

            #region 로그 디렉토리 경로를 설정한다.

            string logDirectoryPath = Path.Combine(programDirectoryPath, "Log");

            #endregion
            #region 로그 디렉토리가 없는 경우 생성한다.

            if (!Directory.Exists(logDirectoryPath))
            {
                Directory.CreateDirectory(logDirectoryPath);
            }

            #endregion
            #region 로그 헬퍼를 설정한다.

            ILogHelper logHelper = new FileLogHelper(logDirectoryPath, "test.log");

            #endregion

            #region 실행 디렉토리 경로를 설정한다.

            string executingDirectoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            
            logHelper?.WriteLog($"EXECUTING DIRECTORY PATH : {executingDirectoryPath}");

            #endregion

            #region 업데이터를 실행한다.

            try
            {
                string updaterPath = Path.Combine(programDirectoryPath, "updater.exe");

                logHelper?.WriteLog($"UPDATER PATH : {updaterPath}");

                if(File.Exists(updaterPath))
                {
                    Process process = Process.Start(updaterPath, "/silentall");

                    process.WaitForExit();

                    logHelper?.WriteLog($"UPDATER PROCESS EXIT CODE : {process.ExitCode}");

                    if(process.ExitCode == 0)
                    {
                        return;
                    }
                }
            }
            catch(Exception exception)
            {
                logHelper?.WriteErrorLog(exception, "ERROR EXECUTE UPDATER");
            }

            #endregion

            #region 테스트 태스크 창을 추가한다.

            this.customControl = new CustomControl();

            this.customTaskPane = CustomTaskPanes.Add(this.customControl, "테스트 태스크 창");

            this.customTaskPane.Visible = true;

            #endregion
        }

        #endregion
        #region 커스텀 애드인 셧다운시 처리하기 - CustomAddIn_Shutdown(sender, e)

        /// <summary>
        /// 커스텀 애드인 셧다운시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void CustomAddIn_Shutdown(object sender, EventArgs e)
        {
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region VSTO에서 생성한 코드

        /// <summary>
        /// 디자이너 지원에 필요한 메서드입니다. 
        /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup  += new System.EventHandler(CustomAddIn_Startup );
            this.Shutdown += new System.EventHandler(CustomAddIn_Shutdown);
        }
        
        #endregion
    }
}

 

[TestProject.Action 프로젝트]

▶ CustomAction.cs

using Microsoft.Deployment.WindowsInstaller;
using System.Diagnostics;
using System.IO;

namespace TestProject.Action
{
    /// <summary>
    /// 커스텀 액션
    /// </summary>
    public class CustomAction
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 로그 헬퍼
        /// </summary>
        private static ILogHelper _logHelper = null;

        /// <summary>
        /// 아웃룩 프로세스명
        /// </summary>
        private static readonly string _outlookProcessName = "OUTLOOK";

        /// <summary>
        /// 아웃룩 파일명
        /// </summary>
        private static readonly string _outlookFileName = "OUTLOOK.exe";

        /// <summary>
        /// 아웃룩 프로세스 실행 여부
        /// </summary>
        private static bool _isRunningOutlookProcess = false;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Static

        #region 생성자 - CustomAction()

        /// <summary>
        /// 생성자
        /// </summary>
        static CustomAction()
        {
            #region 프로그램 디렉토리 경로를 설정한다.

            string programDirectoryPath = "c:\\DSCore\\TestProject";

            #endregion
            #region 프로그램 디렉토리가 없는 경우 생성한다.

            if (!Directory.Exists(programDirectoryPath))
            {
                Directory.CreateDirectory(programDirectoryPath);
            }

            #endregion

            #region 로그 디렉토리 경로를 설정한다.

            string logDirectoryPath = Path.Combine(programDirectoryPath, "Log");

            #endregion
            #region 로그 디렉토리가 없는 경우 생성한다.

            if (!Directory.Exists(logDirectoryPath))
            {
                Directory.CreateDirectory(logDirectoryPath);
            }

            #endregion
            #region 로그 헬퍼를 설정한다.

            _logHelper = new FileLogHelper(logDirectoryPath, "test.log");

            #endregion
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 최초 설치 전 처리하기 - BeforeFirstInstall(session)

        /// <summary>
        /// 최초 설치 전 처리하기
        /// </summary>
        /// <param name="session">세션</param>
        /// <returns>액션 결과</returns>
        [CustomAction]
        public static ActionResult BeforeFirstInstall(Session session)
        {
            _logHelper?.WriteLog("BEGIN BEFORE FIRST INSTALL FUNCTION");

            RemoveOutlookProcess();

            _logHelper?.WriteLog("END BEFORE FIRST INSTALL FUNCTION");

            return ActionResult.Success;
        }

        #endregion
        #region 최초 설치 후 처리하기 - AfterFirstInstall(session)

        /// <summary>
        /// 최초 설치 후 처리하기
        /// </summary>
        /// <param name="session">세션</param>
        /// <returns>액션 결과</returns>
        [CustomAction]
        public static ActionResult AfterFirstInstall(Session session)
        {
            _logHelper?.WriteLog("BEGIN AFTER FIRST INSTALL FUNCTION");

            ExecuteOutlookProcess();

            _logHelper?.WriteLog("END AFTER FIRST INSTALL FUNCTION");

            return ActionResult.Success;
        }

        #endregion

        #region 유지보수 전 처리하기 - BeforeMaintenance( session)

        /// <summary>
        /// 유지보수 전 처리하기
        /// </summary>
        /// <param name="session">세션</param>
        /// <returns>액션 결과</returns>
        [CustomAction]
        public static ActionResult BeforeMaintenance(Session session)
        {
            _logHelper?.WriteLog("BEGIN BEFORE MAINTENANCE FUNCTION");

            RemoveOutlookProcess();

            _logHelper?.WriteLog("END BEFORE MAINTENANCE FUNCTION");

            return ActionResult.Success;
        }

        #endregion
        #region 유지보수 후 처리하기 - AfterMaintenance(session)

        /// <summary>
        /// 유지보수 후 처리하기
        /// </summary>
        /// <param name="session">세션</param>
        /// <returns>액션 결과</returns>
        [CustomAction]
        public static ActionResult AfterMaintenance(Session session)
        {
            _logHelper?.WriteLog("BEGIN AFTER MAINTENANCE FUNCTION");

            ExecuteOutlookProcess();

            _logHelper?.WriteLog("END AFTER MAINTENANCE FUNCTION");

            return ActionResult.Success;
        }

        #endregion

        #region 업그레이드 전 처리하기 - BeforeUpgrade(session)

        /// <summary>
        /// 업그레이드 전 처리하기
        /// </summary>
        /// <param name="session">세션</param>
        /// <returns>액션 결과</returns>
        [CustomAction]
        public static ActionResult BeforeUpgrade(Session session)
        {
            _logHelper?.WriteLog("BEGIN BEFORE UPGRADE FUNCTION");

            RemoveOutlookProcess();

            _logHelper?.WriteLog("END BEFORE UPGRADE FUNCTION");

            return ActionResult.Success;
        }

        #endregion
        #region 업그레이드 후 처리하기 - AfterUpgrade(session)

        /// <summary>
        /// 업그레이드 후 처리하기
        /// </summary>
        /// <param name="session">세션</param>
        /// <returns>액션 결과</returns>
        [CustomAction]
        public static ActionResult AfterUpgrade(Session session)
        {
            _logHelper?.WriteLog("BEGIN AFTER UPGRADE FUNCTION");

            ExecuteOutlookProcess();

            _logHelper?.WriteLog("END AFTER UPGRADE FUNCTION");

            return ActionResult.Success;
        }

        #endregion

        #region 설치 제거 전 처리하기 - BeforeUninstall(session)

        /// <summary>
        /// 설치 제거 전 처리하기
        /// </summary>
        /// <param name="session">세션</param>
        /// <returns>액션 결과</returns>
        [CustomAction]
        public static ActionResult BeforeUninstall(Session session)
        {
            _logHelper?.WriteLog("BEGIN BEFORE UNINSTALL FUNCTION");

            RemoveOutlookProcess();

            _logHelper?.WriteLog("END BEFORE UNINSTALL FUNCTION");

            return ActionResult.Success;
        }

        #endregion
        #region 설치 제거 후 처리하기 - AfterUninstall(session)

        /// <summary>
        /// 설치 제거 후 처리하기
        /// </summary>
        /// <param name="session">세션</param>
        /// <returns>액션 결과</returns>
        [CustomAction]
        public static ActionResult AfterUninstall(Session session)
        {
            _logHelper?.WriteLog("BEGIN AFTER UNINSTALL FUNCTION");

            ExecuteOutlookProcess();

            _logHelper?.WriteLog("END AFTER UNINSTALL FUNCTION");

            return ActionResult.Success;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Private

        #region 아웃룩 프로세스 제거하기 - RemoveOutlookProcess()

        /// <summary>
        /// 아웃룩 프로세스 제거하기
        /// </summary>
        /// <returns>처리 결과</returns>
        private static bool RemoveOutlookProcess()
        {
            try
            {
                Process[] processArray = Process.GetProcessesByName(_outlookProcessName);

                if(processArray.Length > 0)
                {
                    foreach(Process process in processArray)
                    {
                        process.Kill();
                    }

                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
        }

        #endregion
        #region 아웃룩 프로세스 실행하기 - ExecuteOutlookProcess()

        /// <summary>
        /// 아웃룩 프로세스 실행하기
        /// </summary>
        private static void ExecuteOutlookProcess()
        {
            try
            {
                Process.Start(_outlookFileName);
            }
            catch
            {
            }
        }

        #endregion
    }
}

 

■ Advanced Installer 오피스 애드인 프로젝트

※ 버전 1, 버전 2의 대부분 동일하나 경로나 명칭에서 달라질 수 있다.

■ Advanced Installer 업데이트 구성 프로젝트

※ 버전 1(V1.0.0)에 맞춰 버전 2(V1.0.1)도 설정한다.

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

댓글을 달아 주세요