Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

C# - DLL에도 EXE처럼 Main 메서드를 넣어 실행할 수 있도록 만드는 방법

이 글은 다음의 Q&A를 정리한 것에 불과합니다.

Can a C# .dll assembly contain an entry point?
; https://stackoverflow.com/questions/9577567/can-a-c-sharp-dll-assembly-contain-an-entry-point




기본적으로는, DLL에 Main 메서드를 구현했다고 해서 PE 포맷의 Entry Point에 값이 기록되지는 않습니다. 해당 값을 기록하려면 어쨌든 컴파일 자체는 "Library" 유형이 아닌 "Console Application" 등의 유형으로 바꿔야 합니다. 직접 해볼까요? ^^

예를 들어 "Class Library" 타입의 프로젝트를 생성 후, 프로젝트 속성 창에서 "Output type"을 "Class Library"에서 "Console Application"으로 변경한 후, 다음과 같이 Main 메서드를 추가합니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary2
{
    public class Class1
    {
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("ClassLibrary2.Program.Main");
    }
}

빌드하면 (당연히 Console Application으로 변경했으므로) ClassLibrary2.exe가 생성됩니다. 이게 좀 모양이 빠지죠. ^^ 이 부분은 그냥 간단하게 빌드 결과물의 확장자를 바꾸도록 .csproj의 내용에 다음과 같은 설정만 추가하는 것으로 DLL 확장자를 고수할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  ...[생략]...
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <TargetExt>.dll</TargetExt>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <TargetExt>.dll</TargetExt>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  ...[생략]...
</Project>

이렇게 설정한 DLL 프로젝트를 별도의 Console Application에서 참조하면 다음과 같이 EntryPoint를 이용해 실행할 수 있습니다.

byte [] buf = File.ReadAllBytes(@"ClassLibrary1.dll");
Assembly asm = Assembly.Load(buf);
asm.EntryPoint.Invoke(null, null); // Console Application으로 빌드했으므로 EntryPoint가 null이 아님

// 출력 결과
ClassLibrary2.Program.Main

또는 AppDomain.ExecuteAssembly 메서드를 이용해 간단하게 호출하는 것도 가능합니다.

AppDomain.CurrentDomain.ExecuteAssembly("ClassLibrary2.dll");

// 출력 결과
ClassLibrary2.Program.Main

(첨부 파일은 이 글의 예제 프로젝트를 포함합니다.)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 10/18/2018]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 91  92  93  94  95  96  97  [98]  99  100  101  102  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11521정성태5/15/201819177개발 환경 구성: 377. Azure - 원하는 성능 데이터로 모니터링 대시보드 구성
11520정성태5/12/201821383.NET Framework: 748. C# 7.1 - 참조 어셈블리(Ref Assemblies)
11519정성태5/12/201823362개발 환경 구성: 376. ASP.NET Web Application 프로젝트의 FileSystem 배포(Publish) 시 Before/After Task 설정 방법 [1]
11518정성태5/10/201821531.NET Framework: 747. C# 7.0에서도 부분적으로 가능해진 "타입 추론을 통한 튜플의 변수명 자동 지정"
11517정성태5/10/201819742.NET Framework: 746. Azure runbook 예제 - 6시간 동안 수행 중인 VM을 중지 [1]파일 다운로드1
11516정성태5/9/201820623.NET Framework: 745. Azure runbook을 PowerShell 또는 C# 코드로 실행하는 방법파일 다운로드1
11515정성태5/9/201823191.NET Framework: 744. C# 6 - Expression bodied function [1]
11514정성태5/3/201821060오류 유형: 466. Bitvise - Error in component session/transport/kexHandler [2]
11513정성태5/3/201828243.NET Framework: 743. C# 언어의 공변성과 반공변성 [9]파일 다운로드2
11512정성태5/2/201820398개발 환경 구성: 375. Azure runbook 실행 시 "Errors", "All Logs"에 오류 메시지가 출력되는 경우
11511정성태5/2/201821797개발 환경 구성: 374. Azure - Runbook 기능 소개
11510정성태4/30/201822639.NET Framework: 742. windbg로 확인하는 Finalizer를 가진 객체의 GC 과정파일 다운로드1
11509정성태4/28/201820911.NET Framework: 741. windbg로 확인하는 객체의 GC 여부
11508정성태4/23/201822564개발 환경 구성: 373. MSBuild를 이용해 프로젝트 배포 후 결과물을 zip 파일로 압축하는 방법파일 다운로드1
11507정성태4/20/201823290개발 환경 구성: 372. MSBuild - 빌드 전/후, 배포 전/후 실행하고 싶은 Task 정의
11506정성태4/20/201827630.NET Framework: 740. C#에서 enum을 boxing 없이 int로 변환하기 - 두 번째 이야기 [7]파일 다운로드1
11505정성태4/19/201820513개발 환경 구성: 371. Azure Web App 확장 예제 - Simple WebSite Extension
11504정성태4/19/201822015오류 유형: 465. Azure Web App 확장 - Extplorer File manager 적용 시 오류
11503정성태4/19/201820823오류 유형: 464. PowerShell - Start-Service 명령 오류 (Service 'xxx' cannot be started)
11502정성태4/17/201823186개발 환경 구성: 370. Azure VM/App Services(Web Apps)에 Let's Encrypt 무료 인증서 적용 방법 [3]
11501정성태4/17/201820693개발 환경 구성: 369. New-AzureRmADServicePrincipal로 생성한 계정의 clientSecret, key 값을 구하는 방법파일 다운로드1
11500정성태4/17/201821590개발 환경 구성: 368. PowerShell로 접근하는 Azure의 Access control 보안과 Azure Active Directory의 계정 관리 서비스
11499정성태4/17/201820177개발 환경 구성: 367. Azure - New-AzureRmADServicePrincipal / New-AzureRmRoleAssignment 명령어
11498정성태4/17/201820180개발 환경 구성: 366. Azure Active Directory(Microsoft Enfra ID)의 사용자 유형 구분 - Guest/Member
11497정성태4/17/201817888개발 환경 구성: 365. Azure 리소스의 액세스 제어(Access control) 별로 사용자에게 권한을 할당하는 방법 [2]
11496정성태4/17/201818459개발 환경 구성: 364. Azure Portal에서 구독(Subscriptions) 메뉴가 보이지 않는 경우
... 91  92  93  94  95  96  97  [98]  99  100  101  102  103  104  105  ...