성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
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'>MSBuild를 이용한 닷넷 응용프로그램의 다중 어셈블리 출력 빌드</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;' > MSBuild를 이용한 닷넷 응용프로그램의 플랫폼(x86/x64) 별 빌드 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/963'>http://www.sysnet.pe.kr/2/0/963</a> </pre> <br /> 종종 개발을 하다 보면, 플랫폼만 구분단위가 되지는 않습니다. 가령 .NET 응용 프로그램을 만드는 중에 흔한 경우가 있다면 특정 버전의 .NET Framework이 설치된 경우에 따라 어셈블리 생성을 달리해야 할 수 가 있습니다.<br /> <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;' > public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.Text += ": " + ((IntPtr.Size == 4) ? "x86" : "x64"); <b style='COLOR: blue'>#if ISNET35 MessageBox.Show(".NET 3.5"); #endif</b> } } </pre> <br /> 그런 다음, 2가지 버전이 한꺼번에 빌드될 수 있도록, 스크립트를 다음과 같이 변경해 주어야 합니다.<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;' > FOR /F %%I IN ("%0") DO SET CURRENTDIR=%%~dpI SET SOLUTIONDIR=%CURRENTDIR% msbuild MyTest.csproj /property:MyAssemblyName=<b style='COLOR: blue'>MyTest32.Clr20</b>;PlatformTarget=x86;Platform=x86;SolutionDir=%SOLUTIONDIR% msbuild MyTest.csproj /property:MyAssemblyName=<b style='COLOR: blue'>MyTest32.Clr35;DefineConstants=ISNET35</b>;PlatformTarget=x86;Platform=x86;SolutionDir=%SOLUTIONDIR% </pre> <br /> 하지만, 기대했던 결과와는 달리 아래와 같이 대상 폴더에는 MyTest32.Clr20.exe 파일이 보이지 않습니다.<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;' > .\bin\Debug\<b style='COLOR: blue'>MyTest32.Clr35</b>.exe MyTest32.Clr35.pdb </pre> <br /> 도대체 이유가 뭘까요?<br /> <br /> 명령행에서 MSBuild를 해보면 다음과 같이 "IncrementalClean" 단계에서 이전에 했던 msbuild 결과물들을 모두 삭제하는 것을 확인할 수 있습니다.<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;' > IncrementalClean: Deleting file "D:\...\obj\x86\Debug\MyTest32.Clr20.exe". Deleting file "D:\...\obj\x86\Debug\MyTest32.Clr20.pdb". Deleting file "D:\...\bin\Debug\<b style='COLOR: blue'>MyTest32.Clr20.exe</b>". Deleting file "D:\...\bin\Debug\<b style='COLOR: blue'>MyTest32.Clr20.pdb</b>". </pre> <br /> 오~~~ 쪼끔 신기합니다. ^^ 도대체 이전에 빌드했던 DLL들의 파일명을 어떻게 일일이 기억하고 저렇게 싸~~~악 지워버리는지?<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;' > MSBuild is not copying the assembly to the output directory. ; <a target='_tab' href='http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/ae00d3f7-a1c4-4378-96b6-9a4099c74b2a/'>http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/ae00d3f7-a1c4-4378-96b6-9a4099c74b2a/</a> </pre> <br /> 즉, msbuild는 빌드를 할 때마다 ".\obj\[platform]\Debug\MyTest32.csproj.FileListAbsolute.txt"와 같이 "FileListAbsolute.txt" 확장자를 가진 파일에 해당 빌드가 이뤄지는 동안 생성된 파일들의 목록을 기록해 둡니다. 그리고, 다음번 빌드가 수행될 때 "FileListAbsolute.txt" 파일에 있는 모든 파일을 삭제하고 새롭게 빌드를 해주는 것입니다.<br /> <br /> 검색을 좀 더 해보았으나, 마이크로소프프트에서 공식적으로 권장하는 MSBuild 옵션은 찾을 수 없었습니다. 위의 글에서 나온 것처럼 수작업으로 "FileListAbsolute.txt" 파일을 지워주는 것이 최선인데요. 그래서 빌드 스크립트를 다음과 같이 변경해주어야 합니다.<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;' > FOR /F %%I IN ("%0") DO SET CURRENTDIR=%%~dpI SET SOLUTIONDIR=%CURRENTDIR% msbuild MyTest.csproj /property:MyAssemblyName=MyTest32.Clr20;PlatformTarget=x86;Platform=x86;SolutionDir=%SOLUTIONDIR% <b style='COLOR: blue'>del .\*.FileListAbsolute.txt /s</b> msbuild MyTest.csproj /property:MyAssemblyName=MyTest32.Clr35;DefineConstants=ISNET35;PlatformTarget=x86;Platform=x86;SolutionDir=%SOLUTIONDIR% </pre> <br /> 솔직히, 어쩔 수 없이 위와 같이 처리를 하긴 했지만 왠지 개운하지 않은 느낌이 듭니다. 혹시 <a target='_tab' href='http://barunmal.org/member/wordsp_view.htm?idx=8&PHPSESSID=2633ad4169fd3ebb914dfc6c0207b2fb'>좀 더</a> 좋은 방법을 제시해주시는 분이 있을까요? ^^<br /> <br /> * <a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=564&boardid=331301885'>첨부한 파일은 위의 빌드 스크립트가 포함된 예제</a>입니다.<br /> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1616
(왼쪽의 숫자를 입력해야 합니다.)