Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)
하나의 WPF 프로젝트를 WinExe / Library로 빌드하는 방법

참고로, 이 글은 다음의 질문에 대한 답변입니다.

Windows application 프로젝트를 참조 했을 때 생성되는 실행파일을 직접 실행 불가능하도록 하고 싶습니다. 
; https://www.sysnet.pe.kr/3/0/950

원래 닷넷은 EXE 파일이나 DLL이나 그다지 특별한 차이가 없습니다. 단지 Main 함수를 포함하고 그것이 시작함수로 지정된다면 EXE이고, 그렇지 않으면 일반 DLL 인 것입니다. 그래서 EXE 자체를 "참조"해도 DLL과 동일하게 사용할 수가 있습니다.

이렇게 "참조"면에서 DLL/EXE 차이가 없는 것에 나아가서, 결과물 생성을 위한 빌드 자체에도 별반 차이가 없습니다. 그래서 일반적인 Windows Forms 응용 프로그램도 Visual Studio에서 빌드하면 EXE로 생성되지만, 다음과 같이 msbuild로 하게 되면 단순한 dll로 생성하는 것이 가능합니다.

D:\...[생략]...>msbuild WindowsFormsApplication1.csproj /p:OutputType=Library

Visual Studio는 기본적으로 다음과 같이 빌드해 주는 것에 불과하죠.

D:\...[생략]...>msbuild WindowsFormsApplication1.csproj /p:OutputType=WinExe

WPF 응용 프로그램도 같은 맥락이라고 보면 됩니다. 그래서 다음과 같이 실행해 주면 원래는 ^^ 되어야 합니다.

D:\...[생략]...>msbuild WpfApplication1.csproj /p:OutputType=Library

그냥 될 거였으면 ^^ 이번 글을 쓰지 않았겠지요. 아쉽게도 다음과 같은 오류가 발생합니다.

D:\...[생략]...>msbuild WpfApplication1.csproj /p:OutputType=Library
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 2011-02-10 ?? 1:04:45.
Project "D:\...[생략]..WpfApplication1.csproj" on node 1 (default targets).
ResolveAssemblyReferences:
  A TargetFramework profile exclusion list will be generated.
C:\...[생략]...\Microsoft.WinFX.targets(269,9): error MC1002: Library project file cannot specify ApplicationDefinition element. [D:\...[생략]...\WpfApplication1.csproj]
C:\...[생략]...\Microsoft.WinFX.targets(269,9): error BG1003: The project file contains a property value that is not valid. [D:\...[생략]...\WpfApplication1.csproj]
Done Building Project "D:\...[생략]...\WpfApplication1.csproj" (default targets) -- FAILED.


Build FAILED.

"D:\...[생략]...\WpfApplication1.csproj" (default target) (1) ->
(MarkupCompilePass1 target) ->
  C:\...[생략]...\Microsoft.WinFX.targets(269,9): error MC1002: Library project file cannot specify ApplicationDefinition element. [D:\...[생략]...\WpfApplication1.csproj]
  C:\...[생략]...\Microsoft.WinFX.targets(269,9): error BG1003: The project file contains a property value that is not valid. [D:\...[생략]...\WpfApplication1.csproj]

    0 Warning(s)
    2 Error(s)

Time Elapsed 00:00:00.17

보시는 것처럼, Microsoft.WinFX.targets에 구성된 빌드 과정에서 Library 유형으로 빌드하는 대상에 ApplicationDefinition 항목이 정의되어 있으면 안된다고 불평을 하고 있습니다.

실제로 WPF 프로젝트 파일을 보면 다음과 같이 ApplicationDefinition 내용이 포함되어 있습니다.

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>

아하~~~ 그럼, 또 다른 csproj 파일을 만들어서 위의 내용만 삭제된 것으로 해서 msbuild를 통과시켜 주면 되겠군요. 네~, 해결책으로는 맞지만 2개의 csproj 파일을 관리하는 것도 나중에는 '누군가만 아는 일'이 될 것입니다.

그러지 말고 ^^ msbuild 프로젝트의 고유 특성을 살려서 Condition으로 해결하는 것이 더 바람직할 텐데요. 그래서 csproj 파일에 있는 원래 내용에 다음과 같은 변경을 하고 저장해 주시면 됩니다.

<ApplicationDefinition Condition=" '$(OutputType)' == 'WinExe' " Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>

자, 이제 다시 OutputType=Library 옵션을 주고 msbuild를 해주시면 정상적으로 dll 파일이 생성되는 것을 확인할 수 있습니다.




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/9/2021]

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

비밀번호

댓글 작성자
 




... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12734정성태7/26/202123817스크립트: 20. 특정 단어로 시작하거나/끝나는 문자열을 포함/제외하는 정규 표현식 - Look-around
12733정성태7/23/202111154.NET Framework: 1081. Self-Contained/SingleFile 유형의 .NET Core/5+ 실행 파일을 임베딩한다면? [1]파일 다운로드2
12732정성태7/23/20216444오류 유형: 742. SharePoint - The super user account utilized by the cache is not configured.
12731정성태7/23/20217652개발 환경 구성: 584. Add Internal URLs 화면에서 "Save" 버튼이 비활성화 된 경우
12730정성태7/23/20219160개발 환경 구성: 583. Visual Studio Code - Go 코드에서 입력을 받는 경우
12729정성태7/22/20218096.NET Framework: 1080. xUnit 단위 테스트에 메서드/클래스 수준의 문맥 제공 - Fixture
12728정성태7/22/20217560.NET Framework: 1079. MSTestv2 단위 테스트에 메서드/클래스/어셈블리 수준의 문맥 제공
12727정성태7/21/20218575.NET Framework: 1078. C# 단위 테스트 - MSTestv2/NUnit의 Assert.Inconclusive 사용법(?) [1]
12726정성태7/21/20218394VS.NET IDE: 169. 비주얼 스튜디오 - 단위 테스트 선택 시 MSTestv2 외의 xUnit, NUnit 사용법 [1]
12725정성태7/21/20217102오류 유형: 741. Failed to find the "go" binary in either GOROOT() or PATH
12724정성태7/21/20219787개발 환경 구성: 582. 윈도우 환경에서 Visual Studio Code + Go (Zip) 개발 환경 [1]
12723정성태7/21/20217437오류 유형: 740. SharePoint - Alternate access mappings have not been configured 경고
12722정성태7/20/20217271오류 유형: 739. MSVCR110.dll이 없어 exe 실행이 안 되는 경우
12721정성태7/20/20217910오류 유형: 738. The trust relationship between this workstation and the primary domain failed. - 세 번째 이야기
12720정성태7/19/20217262Linux: 43. .NET Core/5+ 응용 프로그램의 Ubuntu (Debian) 패키지 준비
12719정성태7/19/20216423오류 유형: 737. SharePoint 설치 시 "0x800710D8 The object identifier does not represent a valid object." 오류 발생
12718정성태7/19/20217027개발 환경 구성: 581. Windows에서 WSL로 파일 복사 시 root 소유권으로 적용되는 문제파일 다운로드1
12717정성태7/18/20216963Windows: 195. robocopy에서 파일의 ADS(Alternate Data Stream) 정보 복사를 제외하는 방법
12716정성태7/17/20217783개발 환경 구성: 580. msbuild의 Exec Task에 robocopy를 사용하는 방법파일 다운로드1
12715정성태7/17/20219442오류 유형: 736. Windows - MySQL zip 파일 버전의 "mysqld --skip-grant-tables" 실행 시 비정상 종료 [1]
12714정성태7/16/20218225오류 유형: 735. VCRUNTIME140.dll, MSVCP140.dll, VCRUNTIME140.dll, VCRUNTIME140_1.dll이 없어 exe 실행이 안 되는 경우
12713정성태7/16/20218766.NET Framework: 1077. C# - 동기 방식이면서 비동기 규약을 따르게 만드는 Task.FromResult파일 다운로드1
12712정성태7/15/20218180개발 환경 구성: 579. Azure - 리눅스 호스팅의 Site Extension 제작 방법
12711정성태7/15/20218512개발 환경 구성: 578. Azure - Java Web App Service를 위한 Site Extension 제작 방법
12710정성태7/15/202110314개발 환경 구성: 577. MQTT - emqx.io 서비스 소개
12709정성태7/14/20216900Linux: 42. 실행 중인 docker 컨테이너에 대한 구동 시점의 docker run 명령어를 확인하는 방법
... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...