성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>하나의 WPF 프로젝트를 WinExe / Library로 빌드하는 방법</div> <br /> 참고로, 이 글은 다음의 질문에 대한 답변입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Windows application 프로젝트를 참조 했을 때 생성되는 실행파일을 직접 실행 불가능하도록 하고 싶습니다. ; <a target='_tab' href='http://www.sysnet.pe.kr/3/0/950'>http://www.sysnet.pe.kr/3/0/950</a> </pre> <br /> 원래 닷넷은 EXE 파일이나 DLL이나 그다지 특별한 차이가 없습니다. 단지 Main 함수를 포함하고 그것이 시작함수로 지정된다면 EXE이고, 그렇지 않으면 일반 DLL 인 것입니다. 그래서 EXE 자체를 "참조"해도 DLL과 동일하게 사용할 수가 있습니다.<br /> <br /> 이렇게 "참조"면에서 DLL/EXE 차이가 없는 것에 나아가서, 결과물 생성을 위한 빌드 자체에도 별반 차이가 없습니다. 그래서 일반적인 Windows Forms 응용 프로그램도 Visual Studio에서 빌드하면 EXE로 생성되지만, 다음과 같이 msbuild로 하게 되면 단순한 dll로 생성하는 것이 가능합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\...[생략]...>msbuild WindowsFormsApplication1.csproj <b style='COLOR: blue'>/p:OutputType=Library</b> </pre> <br /> Visual Studio는 기본적으로 다음과 같이 빌드해 주는 것에 불과하죠.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\...[생략]...>msbuild WindowsFormsApplication1.csproj <b style='COLOR: blue'>/p:OutputType=WinExe</b> </pre> <br /> WPF 응용 프로그램도 같은 맥락이라고 보면 됩니다. 그래서 다음과 같이 실행해 주면 원래는 ^^ 되어야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\...[생략]...>msbuild WpfApplication1.csproj <b style='COLOR: blue'>/p:OutputType=Library</b> </pre> <br /> 그냥 될 거였으면 ^^ 이번 글을 쓰지 않았겠지요. 아쉽게도 다음과 같은 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\...[생략]...><b style='COLOR: blue'>msbuild WpfApplication1.csproj /p:OutputType=Library</b> 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): <b style='COLOR: blue'>error MC1002: Library project file cannot specify ApplicationDefinition element.</b> [D:\...[생략]...\WpfApplication1.csproj] C:\...[생략]...\Microsoft.WinFX.targets(269,9): <b style='COLOR: blue'>error BG1003: The project file contains a property value that is not valid.</b> [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): <b style='COLOR: blue'>error MC1002: Library project file cannot specify ApplicationDefinition element.</b> [D:\...[생략]...\WpfApplication1.csproj] C:\...[생략]...\Microsoft.WinFX.targets(269,9): <b style='COLOR: blue'>error BG1003: The project file contains a property value that is not valid.</b> [D:\...[생략]...\WpfApplication1.csproj] 0 Warning(s) 2 Error(s) Time Elapsed 00:00:00.17 </pre> <br /> 보시는 것처럼, Microsoft.WinFX.targets에 구성된 빌드 과정에서 Library 유형으로 빌드하는 대상에 ApplicationDefinition 항목이 정의되어 있으면 안된다고 불평을 하고 있습니다.<br /> <br /> 실제로 WPF 프로젝트 파일을 보면 다음과 같이 ApplicationDefinition 내용이 포함되어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > <ApplicationDefinition Include="App.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </ApplicationDefinition> </pre> <br /> 아하~~~ 그럼, 또 다른 csproj 파일을 만들어서 위의 내용만 삭제된 것으로 해서 msbuild를 통과시켜 주면 되겠군요. 네~, 해결책으로는 맞지만 2개의 csproj 파일을 관리하는 것도 나중에는 '누군가만 아는 일'이 될 것입니다.<br /> <br /> 그러지 말고 ^^ msbuild 프로젝트의 고유 특성을 살려서 Condition으로 해결하는 것이 더 바람직할 텐데요. 그래서 csproj 파일에 있는 원래 내용에 다음과 같은 변경을 하고 저장해 주시면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > <ApplicationDefinition <b style='COLOR: blue'>Condition=" '$(OutputType)' == 'WinExe' "</b> Include="App.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </ApplicationDefinition> </pre> <br /> 자, 이제 다시 OutputType=Library 옵션을 주고 msbuild를 해주시면 정상적으로 dll 파일이 생성되는 것을 확인할 수 있습니다.<br /> <br /> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1134
(왼쪽의 숫자를 입력해야 합니다.)