■ AppDomain 클래스 : 별도 어플리케이션 도메인에서 특정 어셈블리 로드하기

------------------------------------------------------------------------------------------------------------------------

TestSolution.zip


[TestLibrary 프로젝트]

 

TestClass.cs

 

 

using System;

 

namespace TestLibrary

{

    /// <summary>

    /// 테스트 클래스

    /// </summary>

    public class TestClass

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

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

 

        #region 메시지 쓰기 - WriteMessage(message)

 

        /// <summary>

        /// 메시지 쓰기

        /// </summary>

        /// <param name="message">메시지</param>

        public static void WriteMessage(string message)

        {

            Console.WriteLine("TestClass.WriteMessage : " + message);

        }

 

        #endregion

    }

}

 

 

[TestProject 프로젝트]

 

AssemblyLoader.cs

 

 

using System;

using System.Reflection;

 

namespace TestProject

{

    /// <summary>

    /// 어셈블리 로더

    /// </summary>

    public class AssemblyLoader : MarshalByRefObject

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

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

 

        #region Field

 

        /// <summary>

        /// 어셈블리

        /// </summary>

        private Assembly assembly;

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

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

 

        #region 수명 주기 서비스 초기화하기 - InitializeLifetimeService()

 

        /// <summary>

        /// 수명 주기 서비스 초기화하기

        /// </summary>

        /// <returns>수명 주기 서비스 객체</returns>

        public override object InitializeLifetimeService()

        {

            return null;

        }

 

        #endregion

        #region 어셈블리 로드하기 - LoadAssembly(filePath)

 

        /// <summary>

        /// 어셈블리 로드하기

        /// </summary>

        /// <param name="filePath">파일 경로</param>

        public void LoadAssembly(string filePath)

        {

            this.assembly = Assembly.Load(AssemblyName.GetAssemblyName(filePath));

        }

 

        #endregion

        #region 정적 메소드 실행하기 - ExecuteStaticMethod(typeName, methodName, parameterArray)

 

        /// <summary>

        /// 정적 메소드 실행하기

        /// </summary>

        /// <param name="typeName">타입명</param>

        /// <param name="methodName">메소드명</param>

        /// <param name="parameterArray">매개 변수 배열</param>

        /// <returns>실행 결과</returns>

        public object ExecuteStaticMethod(string typeName, string methodName, params object[] parameterArray)

        {

            Type type = assembly.GetType(typeName);

 

            MethodInfo method = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public);

 

            return method.Invoke(null, parameterArray);

        }

 

        #endregion

    }

}

 

 

Program.cs

 

 

using System;

 

namespace TestProject

{

    /// <summary>

    /// 프로그램

    /// </summary>

    class Program

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

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

 

        #region 프로그램 시작하기 - Main()

 

        /// <summary>

        /// 프로그램 시작하기

        /// </summary>

        private static void Main()

        {

            AppDomain appDomain = AppDomain.CreateDomain("Test");

 

            AssemblyLoader loader = (AssemblyLoader)appDomain.CreateInstanceAndUnwrap(typeof(AssemblyLoader).Assembly.FullName,

                typeof(AssemblyLoader).FullName);

 

            loader.LoadAssembly("TestLibrary.dll");

 

            loader.ExecuteStaticMethod("TestLibrary.TestClass", "WriteMessage", DateTime.Now.ToShortDateString());

 

            Console.WriteLine("프로그램을 종료하기 위해 아무 키나 눌러 주시기 바랍니다.");

 

            Console.ReadKey(true);

 

            AppDomain.Unload(appDomain);

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요