첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

728x90
반응형

■ AppDomain 클래스 : AssemblyResolve 이벤트를 사용해 포터블 실행 파일(Portable Executable File) 만들기

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


TestProject.zip


1. 솔루션 탐색기에서 아래와 같이 DLL 폴더에 Newtonsoft.Json.dll 파일을 추가한다.

 

 

2. 상기 Newtonsoft.Json.dll 파일의 속성을 아래와 같이 설정한다.

 

 

3. DLL 폴더의 Newtonsoft.Json.dll 파일을 아래와 같이 참조 추가한다.

 

 

4. 참조 추가한 Newtonsoft.Json 항목의 속성을 아래와 같이 설정한다.

 

 

5. 소스 코드를 빌드하면 아래와 같이 파일이 생성된다.

 

 

6. 소스 코드는 아래와 같다.

 

MainApplication.xaml

 

 

<Application x:Class="TestProject.MainApplication"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    StartupUri="MainWindow.xaml">

</Application>

 

 

MainApplication.xaml.cs

 

 

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Reflection;

using System.Windows;

 

namespace TestProject

{

    /// <summary>

    /// 메인 애플리케이션

    /// </summary>

    public partial class MainApplication : Application

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainApplication()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainApplication()

        {

            AppDomain.CurrentDomain.AssemblyResolve += AppDomain_AssemblyResolve;

        }

 

        #endregion

 

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

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

 

        #region 애플리케이션 도메인 어셈블리 분석시 처리하기 - AppDomain_AssemblyResolve(sender, e)

 

        /// <summary>

        /// 애플리케이션 도메인 어셈블리 분석시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        /// <returns>어셈블리</returns>

        private Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs e)

        {

            Assembly executingAssembly = Assembly.GetExecutingAssembly();

 

            string name = e.Name.Substring(0, e.Name.IndexOf(',')) + ".dll";

 

            IEnumerable<string> resourceNameEnumerable = executingAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));

 

            if(resourceNameEnumerable.Count() > 0)

            {

                string resourceName = resourceNameEnumerable.First();

 

                using(Stream stream = executingAssembly.GetManifestResourceStream(resourceName))

                {

                    if(stream == null)

                    {

                        return null;

                    }

 

                    byte[] byteArray = new byte[stream.Length];

 

                    stream.Read(byteArray, 0, byteArray.Length);

 

                    return Assembly.Load(byteArray);

                }

            }

 

            return null;

        }

 

        #endregion

    }

}

 

 

MainWindow.xaml

 

 

<Window x:Class="TestProject.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Width="800"

    Height="600"

    Title="AppDomain 클래스 : ResolveEventHandler 이벤트를 사용해 포터블 실행 파일(Portable Executable File) 만들기"

    FontFamily="나눔고딕코딩"

    FontSize="16">

    <Grid>

    </Grid>

</Window>

 

 

MainWindow.xaml.cs

 

 

using System.Windows;

 

using Newtonsoft.Json;

 

namespace TestProject

{

    /// <summary>

    /// 메인 윈도우

    /// </summary>

    public partial class MainWindow : Window

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainWindow()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainWindow()

        {

            InitializeComponent();

 

            Loaded += Window_Loaded;

        }

 

        #endregion

 

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

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

 

        #region 윈도우 로드시 처리하기 - Window_Loaded(sender, e)

 

        /// <summary>

        /// 윈도우 로드시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void Window_Loaded(object sender, RoutedEventArgs e)

        {

            Student student = new Student { ID = 1, Name = "홍길동" };

 

            string json = JsonConvert.SerializeObject(student);

 

            MessageBox.Show(this, json, "INFORMATION");

        }

 

        #endregion

    }

}

 

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

728x90
반응형
Posted by 사용자 icodebroker

댓글을 달아 주세요