본문 바로가기

C#

[.NET] 어셈블리 하나로 합치기 (ilmerge 사용안함)

 

코딩을 하다보면 dll 들이 엄청 늘어 날때가 있다.

폴더가 지저분해진다.

보기 않좋다.

 

그래서 모든 dll 을 Embed 시키는 방법을 알아 본다.

기존의 ilmerge 라는 툴이 있지만 WPF 등과 같은 프레임웤에 사용하려면 관련된 dll 을 다 열거 하라고 하고 사용법 또한 그리 스마트 하지 않다.

AppDomain.CurrentDomain.AssemblyResolve 를 이용하여 하나로 합칠수가 있다.

우선 사용될 모든 dll 을 비주얼 스튜디오 안으로 끌어 온다

 

.

 

그다음 이 모든 dll 들을 포함 리소스로 만들어 준다.

 

그리고 App 클래스로 이동하여 아래와 같이 코딩 한다.

 

 

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows;

namespace Test_Marge
{
    public partial class App : Application
    {
        public App()
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
        }

        static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            //We dont' care about System Assembies and so on...
            //if (!args.Name.ToLower().StartsWith("Test")) return null;

            Assembly thisAssembly = Assembly.GetExecutingAssembly();

            //Get the Name of the AssemblyFile
            var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";

            //Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder
            var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
            if (resources.Count() > 0)
            {
                var resourceName = resources.First();
                using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
                {
                    if (stream == null) return null;
                    var block = new byte[stream.Length];
                    stream.Read(block, 0, block.Length);
                    return Assembly.Load(block);
                }
            }
            return null;
        }
    }
}

 

 

그리고 난 다음 빌드된 폴더의 exe 만 따로 꺼내어 테스트 해본다.

 

 

출처 : http://blog.mahop.net/post/Merge-WPF-Assemblies.aspx

 

 

참고 : Winform 에서는 Program.cs 의 Application.Run(new Form1()); 위에 작성한다.

  • BlogIcon ghd retailers nz 2013.03.21 18:44

    인생의 목적은 끊임없는 전진에 있다.

  • BlogIcon toms shoes outlet 2013.04.10 08:22

    눈에 눈물이 없으면 영혼에 무지개가 없을 것이다. 

  • BlogIcon gafas carrera 2013.04.11 17:33

    다른 사람에서 다른 사람의 정신적 활동을 이해하고, 사물을 보는 개념은 자신의 미래에 대해 전혀 걱정할 필요가 없습니다.

  • BlogIcon toms shoes 2013.04.11 19:07

    우리가 어디에 있는가가 중요한 것이 아니라 어디로 가야 하느냐가 중요한것이다

  • BlogIcon ralph lauren sale 2013.04.24 15:22

    당신은 내가사랑할 만한 사람이 아니예요,사랑하지 않으면 안될 사람이예요.

  • BlogIcon 匿名 2013.11.28 12:55

    는할 ◣彩钢全自动压瓦机的特点

    彩钢压瓦机分为半自动和全自动之分。 半自动压瓦机只有压型部分,即压型主机。它工作的时候需要借助于剪板机配套使用。由于半自动压瓦机没有自动剪切部分,即主机只能压出瓦型,却不能切割。剪切的时候可使用脚踏小剪板机或者液压剪板机进行剪切。但是生产速度慢,而且耗费人力资源。根据人们的生产需要,现在研制出全自动数控压瓦机
    一种新型全自动压瓦机,该机使用方便,生产速度快,每分钟可压出成型板型8-10米。该全自动彩钢压瓦机都装有剪切装置、电脑数控系统和计数器。您压板过程中只需在数控系统上设置好一次性您需要出板的长度即可,,彩钢角驰压瓦机
    该剪切装置会自动在压出板型后,根据您设定的压板长度自动剪切,而且计数器会自动记录压板数量。还有一个好处就是可以减少操作人员的数量,只需1-2人,就可以每天达到4800米/天。机械厂
    可大大提高了生产速度和工作效지니